




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第一篇 Struts 2基础篇第1章 Struts 2概述全世界发布的第一个MVC框架是Struts 1,它是一个开源框架,用于开发Java Web应用。经过多年的使用和完善,Struts 1变得越来越成熟稳定,成为世界上使用最广泛的MVC框架。与Struts 1相比,Struts 2有着许多革命性的改进,但它并不是一个全新的框架,而是在WebWork框架的基础上发展起来的。本章将先对Struts 1与WebWork进行简单介绍,最后介绍Struts 2,并对它们做简单的比较。 理解MVC模式 了解Model 1与Model 2体系 了解Struts 1框架 了解WebWork框架 熟悉Struts 2框架体系 掌握Struts 2配置文件 熟悉Struts 2控制器 熟悉Struts 2标签库1.1 MVC概述模式-视图-控制器(Model-View-Controller,MVC)是一种目前广泛流行的软件设计架构模式。随着网络应用的快速增加,MVC模式对于Web应用的开发已经成为一种非常先进的设计思想。1.1.1 MVC设计模式MVC设计模式的宗旨就是把一个Web应用的输入、处理和输出流程按照Model、View和Controller的方式进行分离,这样一个应用就被分成3个层:模型层、视图层和控制层。 视图(View)视图代表用户交互界面。一个Web应用可能有很多不同的视图,MVC设计模式对于视图的处理,仅限于视图中数据的采集与处理以及用户请求的处理,而不包括对视图中业务流程的处理。 模型(Model)在Web应用中,模型表示业务数据与业务逻辑,它是Web应用的主体部分,视图中的业务数据由模型提供。使用MVC设计模式开发Web应用,关键的一点就是让一个模型为多个视图提供业务数据,这样可以提高代码的可重用性与可读性,也给Web应用后期的维护带来方便。 控制器(Controller)控制器是视图与模型之间的纽带。控制器将视图接收的数据交给相应的模型去处理,将模型的返回数据交给相应的视图去显示。1MVC模块层关系MVC设计模式的3个模块层之间的关系如图1-1所示。图1-1 MVC模块层的关系2MVC处理过程从前面介绍的内容中可以知道MVC模式处理请求的大致过程。MVC具体的处理过程时序图如图1-2所示。图1-2 MVC处理过程时序图MVC的处理过程从用户发出请求开始,用户发出请求后,视图将请求转发到控制器,控制器调用模型,由模型对业务进行处理,模型完成业务处理后向控制器返回处理结果,控制器根据返回数据选择相应的视图反馈给用户。1.1.2 MVC的优点MVC模式的优点主要有以下几个方面。 低耦合性视图层、模型层和控制层分离,这样就允许在不重新编译模型和控制器代码的情况下更改视图层代码。同样,改变一个Web应用的业务流程或者业务规则时,只需要改变MVC的模型层即可。因为模型、控制器和视图相分离,所以可以很容易改变应用程序的数据层和业务规则。 高重用性多个视图可以对应一个模型,这样可以减少代码的重复性及代码的维护量,一旦模型发生改变,也易于维护。 可适用性随着技术的不断进步,现在需要用越来越多的方式来访问应用程序。MVC模式允许使用各种不同的表现层技术(如JSP、Velocity等)来访问同一个服务器端的代码。 可维护性MVC的3个模块层相分离,使得Web应用更易于维护和修改。1.1.3 Model 1和Model 2体系介绍在开发Web应用时,经常提到Model 1和Model 2,它们是对采用JSP技术构成Web应用的不同模型的描述。下面简单介绍Model 1和Model 2。 Model 1在一个JSP文件中,不但可以包含HTML代码,还可以包含业务逻辑、服务端处理的实现代码。JSP页面中可以非常容易地结合业务逻辑、服务端处理过程和HTML。在JSP页面中同时实现数据显示、业务逻辑和流程控制,可以快速地完成应用开发。现在很多Web应用就是由一组JSP页面构成的。这种以JSP为中心的开发模型可以称之为Model 1。Model 1开发模型的不足之处在于,应用的实现一般是基于过程的,一组JSP页面实现一个业务流程,如果要对业务处理进行改动,必须在多个地方进行修改,这样非常不利于应用扩展和更新。Model 1体系结构如图1-3所示。 Model 2Model 2表示的是基于MVC模式的框架。通过MVC这种设计模型把应用逻辑、处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用,从而弥补Model 1的 不足。图1-3 Model 1体系结构Model 2具有组件化的优点,从而使得它更易于实现对大规模系统的开发和管理。Model 2体系结构如图1-4所示。图1-4 Model 2体系结构在Model 2架构中,Servlet作为前端控制器,负责接收客户端发送的请求,在Servlet中只包含控制逻辑和简单的前端处理。然后,调用后端JavaBean来完成实际的逻辑处理。最后,转发到相应的JSP页面处理显示逻辑。在Model 2模式下,模型(Model)由JavaBean充当;视图(View)由JSP页面充当;控制器(Controller)由Servlet充当。1.2 Struts 1简介Struts 1最早是作为Apache Jakarta项目的组成部分,项目的创立者希望通过对该项目的研究,从而改进和提高JSP、Servlet、标签库以及面向对象的技术水准。1.2.1 Struts 1框架介绍Struts 1是一个为开发基于MVC模式的应用架构的开源框架,是利用Java Servlet和JSP构建Web应用的一项非常有用的技术。Struts 1能充分满足应用开发的需求,而且简单易用。Struts 1把Servlet、JSP、自定义标签和信息资源整合到一个统一的框架中,开发人员利用其进行开发时,不用再自己编码实现全套MVC模式,极大地节省了开发时间。1Struts 1的主要组成部分Struts 1框架主要由以下几个主要部分组成。 模型(Model)Struts 1的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库访问和业务逻辑方法实现。Struts 1框架分为如下组成部分: 模型(Model)Struts 1的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库的访问和业务逻辑方法的实现。Struts 1的Model主要是FormBean,FormBean可以封装客户的表单数据,JSP文件使用Struts 1标签将客户数据传递至FormBean。所有的FormBean都必须继承ActionForm类,以便于对表单数据进行初始化以及验证。 视图(View)Struts 1中的View部分采用JSP实现。不过,Struts 1提供了丰富的标签库,借助这些标签库,可以最大限度地减少Java脚本的使用。 控制器(Controller)Controller是Struts 1框架中的核心组件,由ActionServlet类实现。Struts 1的Controller由如下两部分组成:(1)系统核心控制器,指系统中的ActionServlet,由Struts 1框架提供。(2)业务逻辑控制器,指用户自己实现的Action实例,由Struts 1框架提供。ActionServlet继承了Javax.Servlet.http.HttpServlet类,主要负责接收HTTP请求信息,根据配置文件struts-config.xml的配置信息,将请求转发给适当的Action对象。2Struts 1体系结构Struts 1框架体现了典型的MVC设计模式的特点,其体系结构如图1-5所示。Struts 1的Model部分主要由底层的业务逻辑组件充当,这些业务逻辑组件封装了底层数据库的访问、业务逻辑方法的实现。Struts 1的View部分采用JSP实现,通过自定义标签库可以输出控制器的处理结果。Struts 1的控制器部分由系统核心控制器(ActionServlet)和业务逻辑控制器(Action)组成。系统核心控制器负责拦截所有HTTP请求,然后根据用户请求决定是否需要调用业务逻辑控制器。业务逻辑控制器负责处理用户请求,其本身不具有处理能力,而是调用Model来完成处理。图1-5 Struts 1体系结构3Struts 1的优点Struts 1主要有如下几个优点。 实现MVC模式Struts 1是一个基于MVC的优秀框架。实现MVC模式,可以使应用结构更加清晰。 丰富的标签库Struts 1拥有丰富的标签库,使用这些标签库,可以让页面的开发效率大大提高。 页面导航通过一个配置文件(struts-config.xml),就可以把握整个系统各部分之间的联系,有利于后期的维护。 提供Exception处理机制 数据库连接池管理 支持I18N1.2.2 Struts 1配置文件使用Struts 1开发Web应用,需要熟悉它的配置文件。Struts 1应用采用两个基于XML的配置文件来配置,分别是web.xml和struts-config.xml文件。其中,web.xml文件是配置所有Web应用的,而struts-config.xml文件是Struts 1专用的配置文件。1web.xml配置文件为Struts 1应用配置web.xml文件,具体配置内容如代码1.1所示。代码1.1 web.xml配置Struts 1应用配置ActionServletactionorg.apache.struts.action.ActionServletconfig/WEB-INF/struts-config.xmldebug3detail30Servlet可以映射成.do为后缀的文件action*.doindex.jsp2struts-config.xml配置文件struts-config.xml文件用来建立Controller和Model之间的关系,它描述了Controller所使用的将请求对应到具体处理的法则,同时它还描述了客户提供的数据与ActionForm组件的对应映射关系。例如代码1.2所示内容是struts-config.xml配置文件的典型样式。代码1.2 struts-config.xml文件典型配置FormBean本质上是JavaBean,用来自动存储页面表单中各个域的值定义整个系统都可以使用的全局转向中转地址web.xml文件中后缀为.do的用户请求被转到这里处理1.2.3 Struts 1处理过程在Struts 1应用中,Web应用启动时加载并初始化ActionServlet,ActionServlet从struts-congfig.xml文件中读取配置信息,并把它们存放到各种配置对象中。启动后的应用处理过程如下。(1)通过客户端页面与用户进行交互,将页面提交的数据封装到ActionForm中。(2)通过请求路径查找struts-config.xml配置文件中Action的配置,找到并调用对应的Action。(3)在Action中调用业务逻辑方法处理用户请求。(4)查找ActionMapping,并找到正确的JSP页面进行转发,返回给客户端。Struts 1的大致处理过程如图1-6所示。图1-6 Struts 1处理过程图1.2.4 Struts 1简单示例下面举一个很简单的用户登录的例子来演示Struts 1的应用。在MyEclipse开发工具中,创建一个Web应用,命名为ch1。1配置文件首先需要在应用中加载Struts 1的核心类库JAR文件struts.jar。接下来按照前面介绍的内容,在web.xml配置文件中添加对Struts 1的配置内容,然后在WEB-INF文件夹下创建struts-config.xml配置文件,其内容如代码1.3所示。代码1.3 struts-config.xml配置文件如上述配置,本示例的登录页面是login.jsp,登录成功返回success.jsp页面,登录失败返回fail.jsp页面。2ActionForm本示例的ActionForm为LoginForm.java文件,该文件在src/com.huizhi.struts.form文件夹下,其内容如代码1.4所示。代码1.4 ActionForm文件:LoginForm.javapackage com.huizhi.struts.form;import javax.servlet.http.HttpServletRequest;import org.apache.struts.action.ActionErrors;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionMapping;public class LoginForm extends ActionForm private String userName;u封装表单中的userName属性private String userPassword;v封装表单中的userPassword属性public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) return null;/省略属性的setXXX()和getXXX()方法如上述代码,在LoginForm.java中,uv封装了登录页面的表单属性userName和userPassword。3Action本示例的Action为LoginAction.java文件,该文件在src/com.huizhi.struts.action文件夹下,其内容如代码1.5所示。代码1.5 Action文件:LoginAction.javapackage com.huizhi.struts.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import com.huizhi.struts.form.LoginForm;import dao.UserManage;public class LoginAction extends Action public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) LoginForm loginForm = (LoginForm) form;获取表单信息UserManage um = new UserManage();boolean flag = um.userLogin(loginForm.getUserName(), loginForm.getUserPassword();String page = fail;if(flag)page = success;return mapping.findForward(page);如上述代码,在Action文件中,获取客户端的表单提交信息,然后调用业务逻辑处理方法处理数据,这里是调用类UserManage中的userLogin()方法判断用户是否登录成功,最后根据方法的返回值返回不同的JSP页面。在struts-config.xml文件中有,意思是当Action的execute()方法返回字符串success时,将返回JSP页面success.jsp。4DAO类本示例的DAO类为UserManage.java文件,在这个类中定义一个检查用户是否登录成功的方法。该类在src/dao文件夹下,其内容如代码1.6所示。代码1.6 DAO类:UserManage.javapackage dao;public class UserManage public boolean userLogin(String userName,String userPassword)boolean flag = false;if(admin.equals(userName) & 10101.equals(userPassword)flag = true;return flag;如上述代码,在userLogin()方法中,对用户的账号与密码进行判断,并返回Boolean类型值。5JSP页面本示例首先需要有一个用户登录页面。另外,在Action文件LoginAction.java中,根据业务处理方法的不同返回值返回不同的字符串。其中,当方法的返回值为true时,Action返回字符串fail,通过配置文件可以知道,实际上就是返回fail.jsp文件;当方法的返回值为false时,Action返回字符串success,也就是返回success.jsp文件。下面介绍这3个JSP文件的 内容。1)用户登录页面创建JSP文件login.jsp,该页面用于用户登录,其内容如代码1.7所示。代码1.7 用户登录页面:login.jsp 用户登录 账号:密码:如上述代码,表单的action属性值要与struts-config.xml文件中相应元素的path属性值相一致,输入框的property属性值要与LoginForm.java中封装的属性变量相一致。在JSP页面中使用Struts 1标签,需要在WEB-INF文件夹中添加struts-bean.tld文件与struts-html.tld文件,然后在页面中使用如下语句引入Struts 1的标签库:在struts.jar的解压文件目录的META-INF/tlds文件夹中,可以找到所需要的struts-bean.tld文件与struts-html.tld文件,如图1-7所示。运行程序,在浏览器地址栏中输入http:/localhost:8080/ch1/login.jsp,用户登录页面效果如图1-8所示。 图1-7 Struts 1标签库文件 图1-8 用户登录页面2)登录成功页面创建JSP文件success.jsp,用户登录成功后返回该页面,其主要内容如代码1.8所示。代码1.8 登录成功页面:success.jsp 账号为:$loginForm.userName 密码为:$loginForm.userPassword 如上述代码,在success.jsp页面中使用OGNL表达式$输出表单值。运行程序,在浏览器地址栏中输入http:/localhost:8080/ch1/login.jsp,在登录页面中填写正确的账号与密码,也就是admin和10101,单击【登录】按钮,Web应用返回success.jsp,如图1-9所示。图1-9 登录成功3)登录失败页面创建JSP文件fail.jsp,用户登录失败后返回该页面,此页面内容比较简单,主要内容如代码1.9所示。代码1.9 登录失败页面:fail.jsp 您的账号或密码有误!运行程序,在用户登录页面输入不正确的用户名或密码,然后单击【登录】按钮,Web应用返回fail.jsp,如图1-10所示。图1-10 登录失败1.3 WebWork概述1WebWork来自一个优秀的开源组织OpenSymphony,它是基于MVC架构模式的J2EE Web框架。与Struts 1相比,WebWork更加优秀。WebWork目前最新版本是2.2,现在的WebWork 2.x被拆分成了XWork和WebWork 2两个项目。 XWorkXWork简洁、灵活、功能强大,是一个标准的Command模式实现,并且完全从Web层脱离出来。XWork提供了很多核心功能:前端拦截器(Interceptor)、运行时表单属性验证、类型转换、强大的表达式语言OGNL(Object Graph Notation Language)和倒置控制(Inversion of Control,IoC)容器等。 WebWork 2WebWork 2建立在XWork之上,处理HTTP的响应和请求。WebWork 2使用ServletDispatcher将HTTP请求变成Action、Session、Application范围的映射和Request请求参数映射。WebWork 2支持多视图显示,视图部分可以使用JSP、Velocity、FreeMarker、JasperReports和XML等。1WebWork的优点WebWork有如下优点。 Action不需要与WebWork耦合,这样可以提高代码的重用率。WebWork的Action其实是一个普通Java类(Plain Ordinary Java Objects,POJO)。在WebWork的Action中仅仅需要实现WebWork的Action接口,并包含一个execute()方法,而且在该方法中,不需要出现任何Servlet API和WebWork API。 支持更多表现层技术,从而有更好的适用性。在Struts 1的Action中也包含有execute()方法,但是该方法需要4个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse。2WebWork的特性WebWork的特性包括以下几个方面。 灵活的Validation框架允许开发者在XML文件中定义验证内容,在运行时通过Interceptor(拦截器)自动应用,这样可以完全脱离Action类。 Interceptor在Action处理的前后实现动态拦截,这样可以简化Action代码。 支持I18N 支持OGNL表达式语言 Type Conversion允许在类之间很容易地实现对象的转换。 允许动态对象图表遍历和方法执行,使用ValueStack透明访问多Beans的属性。 IoC容器管理组件的生命周期,使客户不需要通过创建注册类获得组件实例(与容器环境无关)。 Velocity Templates使UI组件可重用,从而允许开发者很容易地定制Web页面的look&feel。 容易和第三方软件集成例如和Hibernate、Spring和Sitemesh等集成。 支持多种视图技术例如支持JSP、Velocity、FreeMarker、JasperReports和XML等。1.4 Struts 2简介Struts 2是在Struts 1的基础上发展起来的,但它却是以WebWork为核心,采用的是WebWork的设计理念。也就是说,是WebWork而不是Struts 1衍生出了Struts 2。由于 Struts 2是WebWork的升级,所以它并不是一个全新的框架,它吸收了Struts 1和WebWork两者的优势,从而使其稳定性、性能等各方面都有了很好的保证。1.4.1 Struts 2框架体系与Struts 1相比较,Struts 2采用拦截器或者拦截器栈,将实现业务逻辑同Servlet API分离开。Struts 2使用拦截器作为处理,以用户的业务逻辑控制器为目标,创建一个控制器代理。Struts 2框架的大致处理流程如下。(1)客户端浏览器发送一个请求。(2)核心控制器FilterDispatcher根据请求决定调用合适的Action。(3)WebWork的拦截器链自动对请求应用通用功能,如验证等。(4)回调Action的execute()方法,该方法根据请求的参数来执行一定的操作。(5)execute()方法的处理结果信息将被输出到浏览器中,Struts 2支持多种形式的视图,例如HTML、JSP等。Struts 2框架的体系结构如图1-11所示。图1-11 Struts 2体系结构图1.4.2 Struts 2配置文件创建Struts 2应用,首先需要Struts 2的核心配置文件struts.xml,该文件用来配置 Struts 2应用中的Action。另外,Struts 2应用中还有一个配置全局属性的perties文件。1struts.xml配置文件Struts 2应用中的Action需要在struts.xml文件中进行配置。在struts.xml文件中,使用元素定义Action,指定该Action的调用名称、实现类以及该Action的处理结果和返回视图的映射关系。struts.xml文件的配置示例如代码1.10所示。代码1.10 struts.xml文件配置示例配置Action/success.jsp配置success返回视图/login.jsp配置input返回视图/users.action/allUsers.jsp如上述代码,在struts.xml文件中配置了3个Action。例如定义的第一个Action,调用名称为login,实现类为action.Login,也就是指action文件夹下的login.java。并且通过元素定义了该Action的处理结果与返回视图的映射,例如,当Action的业务处理方法返回字符串input时,将返回视图login.jsp页面。元素除了name属性以外,还有一个type属性,用来指定转向的资源类型,默认类型为JSP。例如,如果需要转向其他Action,则需要指明转向类型,设置type属性值为redirect。元素的name属性值默认为perties配置文件除了核心配置文件struts.xml以外,Struts 2还有一个全局属性配置文件perties,该文件的形式采用的是Key-Value对,例如:struts.i18n.reload=true自动加载国际化信息struts.i18n.encoding=gb2312定义国际化信息编码形式为gb23121.4.3 Struts 2控制器Struts 2控制器可以分为核心控制器与业务控制器。Struts 2的核心控制器是FilterDispatcher,业务控制器是Action。其中,核心控制器在Web应用中负责拦截所有的用户请求,可以参考1.4.1节的Struts 2体系结构图。在Struts 2应用中起作用的业务控制器实际上不是用户自定义的Action,而是系统生成的Action代理,但是该Action代理以用户自定义的Action为目标。下面举一个Action的示例,如代码1.11所示。代码1.11 Action示例package action;public class Login 封装表单数据private String userName; private String userPassword;/省略属性的setXXX()和getXXX()方法public String execute()Action的默认执行方法if(admin.equals(userName) & 10101.equals(userPassword)return success;返回逻辑视图successelsereturn error;返回逻辑视图error通过上述代码可以发现,该Action完全是一个普通的Java类,不需要实现任何的接口,也不需要继承任何Struts 2基类。与Struts 1的Action相比,Struts 2的Action要简单得多。两者之间的比较如下。 接口 Struts 1必须继承org.apache.struts.action.Action或者其子类;Struts 2无须继承任何类或接口。 表单数据 Struts 1将表单数据封装在FormBean中;Struts 2将表单数据直接包含在Action中。1.4.4 Struts 2标签库Struts 2框架提供了强大的标签库,通过这些标签库,可以大大减少JSP页面的代码编写。而且,Struts 2的标签库并不只是提供了表现层数据处理,还提供了基本的流程控制等功能,例如输出表单数据校验信息。下面举例比较传统HTML标签与Struts 2标签的代码编写效果。(1)使用传统HTML标签编写的JSP页面,如代码1.12所示。代码1.12 传统HTML标签传统HTML标签通讯录(添加联系人)姓名:性别:电话:地址:网页:(2)使用Struts 2标签编写的JSP页面,如代码1.13所示。代码1.13 Struts 2标签Struts 2标签通讯录(添加联系人)上面两个JSP页面仅仅只是为了对比演示Struts 2标签的使用效果,至于Struts 2标签的具体介绍,以及它带来的方便请阅读后面章节的内容。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 校园足球复审汇报
- 生物细胞研究
- 私营医院市场营销部升职晋升管理体系
- 体细胞克隆猴
- 山西省山西大学附属中学2026届化学高三上期末学业质量监测试题含解析
- 生产管理半年度工作汇报
- 数学大政方针讲解
- 实验室周报汇报
- 细胞的电活动
- 烧伤患者营养治疗指南
- 2025年《资料员》考试题库附答案【模拟题】
- GB/T 22080-2025网络安全技术信息安全管理体系要求
- 楼梯 栏杆 栏板(一)22J403-1
- 地基基础工程施工方法及基础知识课件
- 江苏省无锡市各县区乡镇行政村村庄村名居民村民委员会明细及行政区划代码
- 江西师范大学研究生院非事业编制聘用人员公开招聘1人(专业学位培养办公室助理)(必考题)模拟卷
- 2021社会保险法知识竞赛试题库及答案
- SF-36生活质量调查表(SF-36-含评分细则)
- 小学数学校本教研的实践与思考(课堂PPT)
- 经历是一种收获的作文5篇
- 血液透析管路及透析器安装操作评分标准
评论
0/150
提交评论