Java学习笔记11——Struts2框架

时间:2021-07-12 13:13:07

一、Struts2概述

1.Struts2

由出色稳定的框架Struts1和WebWork框架整合而来,提高了开发效率和规范性(如自动封装数据),更好地实现了MVC架构,解除了与Servlet的强耦合性,无需启动服务器即可进行单元测试。

2.Struts2框架的意义

a.更便捷的开发:
自动封装表单提交数据:属性驱动、模型驱动;
便捷地实现上传文件:FileUpload;
使网站通用于国内外:国际化;
通过配置文件完成后台表单验证:校验器;
强大的标签库:Struts2标签库、OGNL标签库。
b.更科学的管理:
使用XML文件管理程序文件的对应关系系。
c.更安全的操作:
安全的线程机制:每个action都是独立的,避免Servlet单例模式的非线程安全问题;
防止数据重复提交:token令牌机制;
异常处理机制:通过配置完成,更便于管理。
d.先进的编程思路:
面向切面编程:拦截器。

3.核心处理机制

用过滤器Filter作为控制器替代多个Servlet实例,完成MVC框架。


二、Struts环境搭建

1.环境搭建

a.下载Struts2的相关支持jar包文件,解压缩apps文件夹中的demo示例,将WEB-INF文件夹->lib文件夹中的jar包复制到自己的工程的lib目录下;
b.将WEB-INF文件夹中->classes文件夹中的struts.xml复制到工程的src目录下;
c.在自己工程的web.xml中配置核心过滤器文件信息filter元素org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter以及filter-mapping元素;
d.将下载的文件src->core->src->main->resources文件夹中的struts.dtd文件导入到Eclipse的Preferences→XML Catalog中,实现在struts.xml中自动提示代码。

2.用MyEclipse IDE帮助导入,右键项目MyEclipse→Add Struts Capabilities,选择版本和默认拦截/*。

3.struts.xml配置文件概述

bean标签:用于创建一个JavaBean实例;
constant标签:用于Struts2默认行为标签,根据name属性不同可设置以下信息。
(1)struts.i18n.encoding配置web默认编码集,相当于HttpServletRequest.setCharacterEncoding用法,所有请求自动设置为该编码格式;
(2)struts.action.extension默认我们的Struts2的请求后缀是.action,配置后action/do都可以;
(3)struts.serve.static.browserCache:设置浏览器是否缓存静态内容,默认值为true,在我们开发阶段建议关闭,防止修改后测试不到;
(4)struts.configuration.xml.reload:当struts配置文件修改后,系统是否重新加载该文件,默认为false,开发阶段建议设为true;
(5)struts.devMode:开发模式下使用,可以打印出更加详细的错误信息;
(6)struts.ui.theme:默认视图主题。
package标签:包标签,用于区分不同的请求文件的标签,比方说网站前台请求,网站后台请求。
(1)name属性:包名,用于被别的包调用或继承;
(2)extends属性:struts.default,继承哪个包,会继承该包下的配置信息和拦截器等;
(3)namespace:选填,url连接必须加入/new/action.xxx。
(4)action元素相当于以前的servlet的概念,对应一个请求name为请求的url地址localhost:8080/项目名/new/login.do;result元素中设置跳转页面,其中的name是该action对应的类中execute方法返回的字符串结果。
include标签:用于引入其他的xml配置文件。


三、Struts2项目走向流转流程

1.项目流转流程:

HTTP请求
→ web.xml中被StrutsRrepareAndExecuteFilter过滤器拦截,并拦截.action/.do请求
→ struts.xml中根据请求的url地址与action地址进行匹配,匹配成功进入相应类文件
→ 前置拦截器:执行相关action前置拦截器,例如封装数据(获取表单中的数据)、上传文件等,是struts2的核心
→xxx.java(action):处理请求的数据,执行类似servlet的操作(接收数据,持久化数据),返回一个字符串标示结果页
→后置拦截器:执行相关action后置拦截器,例如异常信息拦截、日志信息处理等
→struts.xml中根据类返回的字符串匹配,跳转到相应的结果页面
→xxx.jsp:结果页面
→HTTP请求
→....

2.配置文件连接点详述:

JSP文件中表单form中的action;
struts.xml中的package标签中action标签的name和class属性;
对应Java类文件中的execute方法。


四、Struts2数据封装机制

1.属性驱动和模型驱动帮助我们完成数据自动获取和数据自动封装,提高了代码的简洁性和可读性。

(1)属性驱动:编写类继承自ActionSupport类,设置表单属性的getter/setter方法,重写execute方法;在struts.xml文件中配置package标签信息,包括name、extends属性,以及action、result标签;更改jsp文件中form表单的action属性值。
(2)模型驱动:创建有getter/setter方法的实体类;
编写类继承自ActionSupport类并实现ModelDriven<实体类>,然后重写execute方法,实现getModel方法并返回其实体类;
在struts.xml文件中配置package标签信息,包括name、extends属性,以及action、result标签,并加入两个拦截器<interceptor-ref>,分别是modelDriven和defaultStack,这是系统帮助我们封装对象的;
更改jsp文件中form表单的action属性值。

2.标签实现模型驱动

新建模型类和一个Aciton类继承自ActionSupport类,将模型类作为一个属性,创建其getter/setter方法,重写execute方法;
在jsp文件中加入struts2的标签支持<%@ taglib prefix=“s” uri=“/struts-tags”%>,表单使用<s:form>标签,其中action属性只用写action名称,实体类属性<s:textfild>其中的name属性值为action类中的属性.模型属性;
*在struts.xml文件中添加constant标签,name为struts.ui.中theme设置为simple,templateDir设置为template,templateSuffix设置为ftl,可以使得jsp中的struts表单样式失效,从而可以自己控制样式并调整。
配置struts.xml文件中的action标签。

3.封装数据的核心机制:用反射实现。

对模型驱动,处理流程为当请求发送到action之前,调用action类中的getModel方法获取要将表单数据封装到哪个实例化的对象中,获得该对象后我们可以获得类类型,获得类类型后就能得到类中的属性,再通过request.getParameters获得表单提交的所有数据名,从而获取值。如果表单提交的name值与实体类中属性名一致,那么我们将获得表单中的数据封装到模型对象中去。
实现过程,在继承自HttpServlet类的中转站BaseServlet类的doPost方法中:
在程序运行时,获得当前类的getModel方法对象;
通过invoke方法调用该方法获得实体类对象;
通过实体类对象获得类类型;
通过类类型获得类中的属性对象数组;
通过request获得所有的表单中提交的name值;
循环枚举中的值;
>获得枚举中的值,就是表单提交的name值;
>循环类中所有的属性对象;
>>判断如果类中属性的名字和表单中提交的名字一致;
>>获取request.getParameter(fieldName)封装到对象中;
调用默认的方法执行处理,获得返回的字符串,根据获得的字符串跳转页面。
编写LoginServlet继承自BaseServlet类,在其中实现execute和getModel方法,处理请求时调用父类的doPost方法。