1.Struts与Java Web应用简介
Struts为Java Web应用提供了框架.它可以提高开发的速度.
优点:
本身是一群Web开发专家的智慧结晶;
运用广泛;
适用于开发大型复杂的Web应用.
Java Web应用的核心技术是Servlet和JSP
Struts框架中JSP位于视图层,而Servlet位于控制层
几个重要的API
HttpServletRequest:由Servlet容器把用户的请求存在此对象中
HttpServletResponse:用于生成Http响应结果
HttpSession:容器为每个Http会话而创建的一个实例,用于保存会话中的共享数据
ServletContext:为每个Web应用而创建的实例,存放application范围内的数据
HttpServletRequest,HttpSession,ServletContext都提供了操作共享数据的方法
setAttribute(String key,Object value)
getAttribute(String key)
与容器提供的接口一样,因此getAttribute(String key)方法返回的是Object,需要做强制转型
HttpSession的生存期有:
客户端关闭浏览器;
会话过期;
服务端调用HttpSession.invalidate()方法.
相对来说Session的生存期较长,因此如果可以的话应将数据保存在Request范围内,这样可以缩短对象的生存期;另外象Tomcat这样的容器提供了管理Session的功能,可以对其做持久化管理.
Web应用中数据生存的范围:
1.page
2.request
3.session
4.application
JavaBean:
就是符合特定规范的Java对象,在JSP中提供了标签便于处理
JSP中操作JavaBean常用标签有:
<jsp:useBean id="bean名称" scope="生存期" class="ddm.MyBean" />
<jsp:getProperty name="bean名称" property="属性名" />
<jsp:setProperty name="bean名称" property="属性名" value="值" />
JavaBean常位于模型层,由它提供数据及逻辑
Struts中的ActionForm Bean就是一种JavaBean,它仅在视图层和控制层之间传递用户输入的表单数据,位于视图层,它只能有两种生存范围:request,session
客户化JSP标签
在Jsp1.1中出现,支持用户在JSP中自定义客户化标签,这些标签常用于处理复杂的逻辑运算和事务以及定义JSP的输出内容和格式.
优点:
. 标签具有可重用性,因此可以提供开发效率
类似于asp中的JS函数,jsp中的嵌入页
. 可以在JSP页面中以静态或动态的方式设置标签的属性
. 标签可以访问JSP网页中的所有对象
. 标签可以相互嵌套,来完成复杂的逻辑
. 可以使JSP页面更简洁,提高可读性
对于这个有不同的意见,我认为实际上降低了可读性;因为程序的可读性实际上是适用于程序开发/测试人员的,除此之外别无他人,而引用各种技术,只会提升技术上的复杂度,增加修改的难度;所谓的"类的可重用性",就我看来是指特定人群的,对于专业的高手来说是可以提升效率的,但是对于某种技术一知半解的人来说,只会提升开发难度.一旦类被重用,错误的影响面也会非常之广.
Struts提供了五种标签库:
1.Bean
2.HTML
3.Logic
4.Nested
5.Tiles
EJB
EJB(企业JavaBean)组件是基于标准分布式对象技术,CORBA,RMI的服务端Java组件
它与JavaBean的联系
相同点:都用于实现企业应用的业务逻辑,都位于模型层
区别:EJB总是分布式的;EJB需要运行于应用服务器中,而JavaBean只需要Servlet/JSP容器
XML
应用广泛,它可以描述结构化的数据,通常与DTD一起使用(声明标记使用规则),常用于配置文件
Struts中的两种重要的XML文件
web.xml
普通的Web应用都有,它用于配置Web应用,如配置Servlet
. struts-config.xml(可以使用别的名称,需要在web.xml中对应)
Struts框架的配置文件,主要是Action的配置,这个XML文件包含了几个标签,在书写时各子标签的书写顺序有着严格要求
Web组件的关联关系
1.请求转发
只能发生在同一个Web应用中,在服务端完成转发
RequestDespatcher rd = request.getRequestDispatcher("hello.jsp");
rd.forward(request,response);
JSP中使用的标签:
<jsp:forward page="hello.jsp" />
这种方式可以共享request范围内的数据
2.重定向
与转发类似,但是可以将请求转发到不同的Web应用,在客户端完成定向(由服务端发一个信息给客户端浏览器,浏览器将新发一个请求)
response.sendRedirect("
http://www.javablog.net/tw-ddm
");
由于可能发生在不同的Web应用,因此不能共享request范围的数据
3.包含
是一个聚集的概念,可以共享request数据,常用于模板,程序的控制权在调用者,被包含者只是暂时有控制权,执行完毕后需要传回
RequestDispatcher rd;
rd = request.getRequestDispatcher("/header.jsp");
rd.include(request,response);
包含由于不会产生控制权的转移,因此能够在一个组件中包含多个
JSP中使用标签:
<jsp:include page="/hello.jsp" flush="true">
<jsp:param name="username" value="ddm"/>
</jsp:include>
这是动态包含,它可以传递参数,它可以包含动态或静态文件,每次运行时容器都会去检查文件是否发生变化
<% @include file="/hello.jsp" %>,容器不会每次去检查文件,常用于包含静态页面
Struts是实现MVC模式的框架
视图层:
JSP作为MVC中的视图,它没有业务逻辑,也没有模型信息,只有标签
ActionForm bean 由于只处理表单数据,联系视图和控制器,因此也被分为视图层
模型层:
由JavaBean和EJB来实现,某些简单的功能,有时也直接让Action扮演控制器和模型两种角色
控制器:
由ActionSevlet和Action来实现.
ActionSevlet类是Struts框架中的核心组件.继承了HttpServlet,在MVC中作为中央控制器存在,因此只能有一个
这个核心玩意也是可以替换的,只要新类是从ActionServlet派生即可,同时也需要在web.xml中改变对应的class名称
Action由ActionServlet根据Struts-config.xml配置文件来产生,它负责调用合适的模型(JavaBean,EJB),因此它也具有适配器的作用,相当于控制器和模型之间的隔离层(适配器)
Action必须实现基类的execute()方法,此方法返回一个ActionForward对象,由ActionForward对象封装响应,为增加应用的可配置,提倡从配置文件中findForward
配置文件:
struts-config.xml
配置文件中描述了多个Action的映射信息,初始化时被封装在ActionMapping对象中,每个action元素对应一个ActionMapping对象
该配置文件中有个<controller>元素,是用于配置ActionServlet的,比较有用的是:<controller contentType="text/html;charset=UTF-8" locale="true" />,这里的contentType应用于全局范围,如果在JSP文件中指定将在局部履盖这个选项,换句话说这里指定了,就可以在JSP页面省心了,另外说一句,用Myeclipse生成的JSP,如果是从ActionForm生成则不会有这些信息,只有要设计视图中单独拖一个出来时才会具有.
工作流程:
1.检索与用户请求匹配的ActionMapping对象,如果不存在则返回路径无效的信息.
2.检查有无ActionForm对象,如果没有则创建,并将用户提交的表单数据保存在其中.
3.根据配置决定表单是否需要验证,如果需要验证,则调用ActionForm的validate()方法.
4.如果validate()方法返回null或不含ActionMessage的ActionErrors对象,则表示成功.失败则返回input页面
5.根据ActionMapping包含的映射信息,查找及新建Action对象,然后调用该对象的execute()方法.
6.Action对象的execute()返回一个ActionForward对象,然后由ActionServlet转发客户请求给ActionForward中指向的JSP组件
7.由该JSP生成网页以响应客户请求.