`

servlet和jsp核心编程(第2版)第十五章servlet和JSP的集成,模型-视图-控制器构架

阅读更多
第十五章:servlet和JSP的集成,模型-视图-控制器构架
一MVC的需求
1.MVC框架,在复杂的应用中,使用更为复杂精致的MVC框架有时会更有利,这些框架中最流行的是Apache Struts,尽管Struts很有用且被广泛采用,但实现MVC方案并不一定要使用Struts,对于简单和中等复杂的应用,使用RequestDispatcher从零开始实现MVC更为直观和灵活。

二、用RequestDispatcher实现MVC以下是步骤:
1.定义bean来表示数据(我们也可以理解他为结果bean:表示请求结果的java对象),我们在jsp中使用getProperty访问bean中的属性,我们不需要修改和创建bean,这些工作由servlet或其他java例程来做,因此,我们可以把这个bean定义为值对象:仅表示结果的对象,只是很少甚至根本没有任何其他功能。

2.编写servlet处理请求:servlet读取请求参数,请求报头,也可以使用populateBean方法填写表单bean,注意不是结果bean。特别要注意采用MVC方案时,servlet并不创建任何输出,输出完全由JSP页面来完成。

3.填写结果bean,读取请求参数之后,由servlet调用相应的商业逻辑或数据访问代码,获得最后的结果,然后将结果放置在第一步我们定义的bean中,也就是值对象中。

4.结果的存储,这一步当中,我们需要将这些bean存储在jsp页面能够访问的位置。servlet可以在3个位置存储JSP页面所需的数据,分别是,HttpServletRequest,HttpSession,ServletContext中。对应jsp:useBean的scope属性的3种非默认值。即request,session和application。比如
request.setAttribute("key",value);session.setAttribute("key",value);getServletContext().setAttribute("key",value);

5.转发请求到JSP页面,转发请求使用RequestDispatcher的forward方法,RequestDispatcher的获取需要调用ServletRequest的getRequestDispatcher的方法并提供相对地址。我们可以指定WEB-INF目录中的地址,<核心方法>如果JSP页面只在由servlet生成的数据的上下文中才有意义,则可以将页面放置在WEB-INF目录中,这样servlet可以将请求转发到该页面,但客户不能直接访问他们。<重点提示>这里要注意RequestDispatcher的forward方法时,客户看到的是初始servlet的URL,而非最终JSP页面的URL。a.我们可以把请求转发到静态资源,但静态页面只能处理get请求,不能处理post请求,因为Post请求中的请求参数是在Http请求正文内,静态页面无法取出其参数。所以我们只要把静态页面的后缀改为jsp,就既可以处理get请求,也可以处理post请求。b.重定向替代转发,即使用response.sendRedirect ,这种用法适用于重新显示不完全的HTML表单,因为我们可以把之前创建的数据从会话中取出。而如果使用RequestDispatcher的forward方法,则无法把之前创建的数据信息取出。
从第二步到第五步,都是在servlet中编写。

6.从bean中提取数据。但要注意我们不在jsp页面中创建bean,所以使用<jsp:useBean id = "" type = ""/>而不是使用
<jsp:useBean id = "" class = ""/>。
第二点要注意的是,我们一般不修改bean中的属性,所以我们不使用<jsp:setProperty/>

三、目的页面中相对URL的解释。1.因为RequestDispatcher的forward方法只维护最初的servlet的URL,那么它所转到的页面的相对地址也是相对于原来的servlet,这几乎会产生错误,比如<link ref = "stylesheet" href = "my-styles.css" type = "text/css"> 这里的href相对的就是原来servlet中的地址,所以我们要把它改为绝对的URL
<link ref = "stylesheet" href = "/path/my-styles.css" type = "text/css">,

同样<img src = "">和<a href ="">也要注意这个问题。
四、从jsp页面转发请求
<jsp:forward page = "relative url">


五、包含页面

1[size=medium][/size].转发forward的一种替代方案是包含include,servlet依旧依靠jsp也页面生成输出,但servlet调用不同的jsp页面生成最终页面的不同部分,事实上,RequestDispatcher的include方法就是jsp:include动作在后台调用的代码。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics