Struts2框架
Struts2是一种实现了MVC模式的表现层框架
struts2的远程执行漏洞:
选择版本 Struts2.3.15+或者2.5.10+,这个漏洞已经被修复
hello Struts2:
1、添加jar包
commons-fileupload和commons-io commons-lang3 freemarkerlog4j-api ognl[对象图导航语言] sturts2-core javassist
2、配置前端控制器 web.xml
注意:不能将其它Filter配置在前端控制器之内
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3、添加Struts2的核心配置文件
惯例:位于src根目录下,名称为struts.xml[包括大小写在内,不允许修改;否则必须进行配置]
xml文件头可以在struts2-core.jar中的文件/struts-2.5.dtd中进行查找
<?xmlversion="1.0" encoding="UTF-8"?>
<!DOCTYPEstruts PUBLIC
"-//ApacheSoftware Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
</struts>
4、定义提交数据的页面
<formaction="regist.action" method="post"> Struts2默认的路径后缀为.action或者没有后缀
<table>
<tr><td>用户名称:</td><td><input type="text"name="username"/></td></tr>
<tr><td>用户口令:</td><td><input type="password"name="password"/></td></tr>
<tr><tdcolspan="2">
<inputtype="submit" value="添加新用户"/>
</td></tr>
</table>
</form>
5、定义控制器接收用户提交数据
public classRegistAction {
// 这里的名称和提交数据的页面中的name一致,如果类型不是String或者String[],则框架自动进行类型转换
private String username;
privateString password;
privateString message;
publicString execute() throws Exception {注意名称必须一致
具体的处理逻辑,如果需要还会访问其他的bean
System.out.println(username+ "---" + password);
if(username == null || username.trim().length() < 1)
message= "Hello Struts2!";
else
message= "Hello " + username + "!";
return"success"; 返回的字串值是需要跳转的页面的逻辑地址名,默认请求转发
}
对应的get/set方法
6、在struts.xml中配置控制器
<packagename="default包名称,可以随意定义,只要不冲突即可" extends="struts-default继承,以减少配置信息" strict-method-invocation="false">
<actionname="regist请求路径,表单提交的action是regist.action,表示调用RegistAction中的execute方法" class="com.yan.action.RegistAction">
<result name="success">/show.jsp</result>注意:Action的execute方法返回的String值是逻辑地址名,这里配置逻辑地址名对应的物理地址
</action>
</package>
7、跳转的目标页中如何访问Action中的message属性
${message} --EL表达式
struts2大致处理流程:
1)浏览器发送请求
2)核心前端控制器StrutsPrepareAndExecuteFilter根据请求决定是否调用相应的Action
3)struts2内置的拦截器链会自动对请求进行一些操作
4)调用Action的execute方法,执行操作。
5)Action会将处理结果存入stack Context中,并返回字符串(逻辑地址名),核心控制器根据字符串跳转到指定的视图资源。
6)视图资源会读取Stack Context中的信息,向浏览器生成响应数据。
Struts 2框架的特点:
POJO表单和POJO动作 - Struts2的Struts框架已经摆脱了动作表单组成部分, Struts2可以使用任何POJO接收的形式输入。同样现在可以看到任何POJO作为一个Action类。
标签支持 - Struts2中,提高了表单标签和新标签允许开发人员编写更少的代码。
AJAX支持- Struts2中已确认由Web2.0技术接管,并整合到产品中,通过创建AJAX标签,功能非常相似的标准Struts2 标签AJAX支持。
易于整合 - Struts2 集成各种整合与其他框架如Spring,Tiles 和SiteMesh是现在更容易。
模板支持 - 支持生成使用模板。
插件支持 - 可以提高核心Struts2的特性,并增强使用插件。大量的插件可供Struts2。
性能分析 - Struts2的分析,调试和分析应用程序提供了集成。除此之外,Struts还提供了集成的内置调试工具调试。
易于修改标签 - Struts2的标签标注,可以调整使用Freemarker的模板。这并不需要JSP或Java知识。基本HTML,XML和CSS知识是足够修改标签。
提倡少配置 - Struts2 促进较少的配置的帮助下,使用默认的各种设置值。不必配置的东西,除非它不符Struts2的默认设置。
视图技术: - Struts2中有一个很大的支持多个视图选项 (JSP, Freemarker, Velocity 和 XSLT)
Struts 2的缺点:
更大的学习曲线 - 要使用MVC与Struts,你必须是习惯使用标准的JSP,Servlet API和大量精心设计的框架。
欠佳的文档 - Struts有标准的servlet和JSP API的相比,更少的在线资源,许多用户第一时间发现网上Apache文档混乱和管理不善的组织。
较少透明度 - Struts应用程序中,有很多幕后比正常的基于Java的Web应用程序,这使得它很难理解的框架。
执行性能较差
Struts2实现了MVC模式:
Model:Action的定义支持,运行特征是多实例单线程(不用考虑线程安全问题)
View: Struts2默认提供了4种视图技术的支持,JSP, Freemarker, Velocity 和 XSLT
Controller: 前端控制 StrutsPrepareAndExecuteFilter和一组拦截器
Action的定义方法:
1、不继承任何类,不实现任何接口,就是一个POJO,这里体现了struts2的轻侵入性
public classMyAction{
publicString execute()throws Exception{} 这是唯一要求
}
问题:逻辑地址名缺少规范,execute方法签名IDE不能进行检查
2、引入Action接口
有5个常量(字串类型)是建议的逻辑地址名
ERROR表示出错,跳转出错处理页
SUCESS表示执行正常,跳转到成功页面
Input表示跳转到输入页,实际上一般用于实现提交数据的报错显示
NONE表示执行正常,但是不跳转任何页面,一般用于测试
LOGIN表示跳转的登录页
抽象方法execute用于规范方法签名
public classAddAction implements Action {
publicString execute() throws Exception {
returnSUCCESS;
}
}
3、为了进一步简化Action编程,Struts2提供了一个父类ActionSupport
public classcom.opensymphony.xwork2.ActionSupport
implementscom.opensymphony.xwork2.Action,所以5大常量有效,同时ActionSupport提供了execute方法的默认实现,所以子类中execute方法不是必须的
public String execute() throws Exception { return SUCCESS; }
com.opensymphony.xwork2.Validateable,com.opensymphony.xwork2.interceptor.ValidationAware,提供了服务器端数据校验的支持
com.opensymphony.xwork2.TextProvider,com.opensymphony.xwork2.LocaleProvider,提供了国际化和本地化的支持
java.io.Serializable
public classUserAction extends ActionSupport {
privateString username; //必须有对应的get/set方法,否则注入请求参数失效
publicString execute() throws Exception {
System.out.println(username);
returnNONE;
}
}
<actionname="user" class="com.yan.action.UserAction"></action> 这里没有配置method属性,所以调用的方法名称一定是execute
如果需要进行服务器端数据校验? 例如:username不允许为空
@Override
publicvoid validate() {
//这个用法用于在执行execute方法之前进行服务器端数据校验
if(username==null|| username.trim().length()<1)
this.addFieldError("username","用户名称不能为空");//addFieldError用于添加和输入域相关的报错信息,参数1是输入域的名称,实际就是报错显示的位置;参数2是报错提示信息
//主要添加了报错信息,则不会执行execute方法,而是默认直接跳转到INPUT页面,所以必须配置<result name=input>
}
如何显示报错信息?
使用Struts2的标签库,Struts2标签库可以分为两大类:UI标签和非UI标签
在开发中可以直接使用html标签定义页面,但是定义比较繁琐,显示报错信息比较麻烦,建议使用Struts2的标签
引入标签库:<%@ taglib uri="/struts-tags"prefix="s" %>
引入UI标签的css和相关的js文件<s:head/>
定义form表单<s:form action="user.action">
定义单行输入域<s:textfield name="username" label="用户名称"/> name是输入域名称,label是对应的显示提示信息
定义密码输入域<s:password name="password" label="用户口令"/>
定义提交按钮<s:submit value="提交数据"/>
使用<s:form>默认自动显示报错信息
运行时常量的配置 struts2-core.jar中/org/apache/struts2/default.properties
Struts2中默认的后缀是.action或者没有后缀
struts.action.extension=action,,
如果需要修改配置 struts.xml中定义
<constantname="struts.action.extension" value="action"/>
这里表示只能使用.action后缀,没有后缀不识别