Struts实现了MVC模式的JavaEE 企业级的轻侵入性、轻量级表现层 web 开源框架。框架设计的目标贯穿整个开发周期,从开发到发布,包括维护的整个过程。
实现MVC模式
Model:Action(业务控制器),多实例单线程
View:4中视图技术(jsp xslt freemarker velocity)
Controller:PrepareAndExecuteFilter+拦截器s
版本
Struts2.3.15+或者struts2.5.10+ 远程执行漏洞
新建Struts
添加必须的jar包
ommons-fileupload/commons-io
commons-lang3 javassist freemarker
ognl log4j struts2-core
配置前端控制器 web.xml
过滤器的名称 以及路径
Class 文件为 新建一个类 在继承里面打StrutsPrepareAndExecuteFilter会有提示 复制 粘贴 <filter-class>
<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>
定义首页的配置
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
所有的在<web-app> </web-app> 里面写
配置Struts2的核心配置文件
struts2-core.jar中包含了一个配置struts-default.xml,其中定义了一个抽象包
<packagename="default" extends="struts-default"strict-method-invocation="false">
abstract=true表示当前包为抽象包,表示这个包的配置信息不能直接使用,只能供其他包使用
<!DOCTYPE strutsPUBLIC
"-//Apache Software Foundation//DTD StrutsConfiguration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
在struts2-core-2.5.16jar下的 struts-2.5.dtd
测试一部署当前应用,查看控制器是否有报错信息
定义表结构
在web.xml里面定义首页
定义Action
需要请求转发到add.jsp页面,在struts.xml中配置
<package name=”default” extends=”struts.xml”>
<action name=”addinput”></action>
Struts2为了简化页面编写提供了一套标签库,可以分为2大类:UI标签(有显示的,例如生成输入域的<s:textfield/>)和非UI标签(显示逻辑<s:if>)
定义Action接收用户提交数据
AddAction 继承自ActionSupport
Action中有常量 在不同情况下返回 里面有一个execute(); 方法 默认返回值为SUCCESS
ActionSupport 里有execute的默认显示 获取success的对应页面
ActionSupport里有五大常量 execute方法名
Validateable ,ValidationAware服务器端数据效验提供支持
TextProvider ,LocalProvide 对于国际化 I18N 本地化L10N
Serializable 序列化接口
在action中接收用户提交数据有三种方法
属性驱动
模型驱动
对象驱动
属性驱动:
<input name=”userbean”>对应Action类中的属性private String username (get/set方法)
推荐模型驱动: ModelDriven接口
要实现 ModelDirven<用户类>() 有一个getModel方法
页面不发生变化<input name=”username”/>
对应值bean中的属性private String username (get/set方法)
Action定义
public class UserAction extends ActionSupportimplemenets ModelDriven<UserBean>{
privateUserBean user=new UserBean();//建议直接new对象,可以没有get/set方法
publicUserBean getModel(){return user; }//保证返回值不能为null
}
对象驱动
页面发生变化 <input name=”user.username”/>
其中user对应Action类中的属性private UserBean user;(get/set),而username对应值bean中的属性private Stringusername (get/set方法)
Action类定义
public class UserAction extendsActionSupport{不需要实现接口
private UserBean user;//可以new也可以不用new,必须get/set方法
}
Apache Struts 2 体系结构概述
web浏览器请求一个资源(/mypage.action, /reports/myreport.pdf等)。
过滤器StrutsPrepareAndExecuteFilter查找请求和确定适当的 Action。
拦截器自动应用公共功能到请求,像操作,验证和文件上传操作。
Action 的 execute 方法通常用来存储和重新获得信息从数据库。
结果被返回到浏览器,可能是 html, 图片或其它。
Namespace的概念
<packet>用于定义一个包,属性名name 用于定义包名,注意包名不能重复
namespace=""用于定义action地址的名空间,可以不配置,不配置则等价于 namespace=""。
某个Actiond对应的访问URL= 名空间 /具体Action的名称 。名称空间是当页面名字相同的情况下,可以能过 namespace 来区 分访问路径
如果对应的包中没有匹配的action,则查找没有名空间的包(namespace没定义,这是默认的包),在默认包中查找对应的action。
如果都找不到则报404
Action类中方法的定义
根据面向对象规则,需要将一组相关的操作定义在一个Action类中,在MVC部分实现方法的实现
<action>配置的name是访问当前action对应的URL(namespace),class是对应的类全名。另外还有一个属性method="方法名称"如果不进行配置,则默认调用的方法名称为execute,如果方法名称不是execute则需要配置method属性
匹配方法使用的推荐
在配置<action>中*号通配符,*可以匹配任意长度的任意字符。ame属性中使用*,则在其它配置位置可以使用{1}引用和*匹配的内容
Eg: <action name=”*” class=”com.wu.action.UserAction” method={1} ><action>
如果定义了多个不同类的方法映射,则直接使用*就可能有二意性
<action name=”user_*” class=”com.wu.action.UserAction”method=”{1}”>
表示user_add.action调用UserAction类中的add方法
DMI动态方法调用:
默认框架关闭了DMI,对应的运行时常量是 struts.enable. DynamicMethodInvocation= false
调试相关的常量配置:拦截器实现打开调试
Struts.devMode=true 依赖于的debugging
struts.i18n.reload= true自动发现并加载修改的properties文件—国际化处理
struts.configuration.xml.reload = true 自动发现并加载修改的 struts.xml 之类的配置文件
配置方法:推荐
在web.xml配置前端控制器时直接设置
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
在action包下定义校验信息的xml文件
名字叫 类名称-validation.xml
定义对应的校验规则文件,说明需要执行什么校验
这里的<field/>标签中的name属性和输入域的name要一致,表示对哪个属性进行验证。Field-validator用于说明要执行什么验证,具体的type名称定义在default.xml文件中/com/opensymphony/xwork2/validator/validators/default.xml
<fieldname="username">
<field-validatortype="requiredstring">
<message>用户名称不能为空!</message>
</field-validator>
</field>
Type对应的类型 是validators设置好的.
在default.xml文件中/com/opensymphony/xwork2/validator/validators/default.xml
如何避免客户端缓存的影响
3个响应头的设置
服务器端避免客户端缓存的方法:
<meta http-equiv="pragma"content="no-cache">
<metahttp-equiv="cache-control" content="no-cache">
<meta http-equiv="expires"content="0">
客户端避免客户端缓存的方法:
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);