struts2是实现的MVC模式的JavaEE企业级的轻侵入性.轻量级的表现层web开源框架,提供了开发,发布,到维护过程中的支持.
在apache的官网开开源软件中进行下载https://struts.apache.org/
注意事项:
有两个版本
可下载Struts2.3.15以上版本或者struts2.5.10以上版本,较低版本存在远程执行漏洞
8个jar包
commons-fileupload/commons-io 支持文件上传下载
commons-lang3 提供语言的一些扩展
javassist 字节码处理
ognl 一种强大的El表达式
freemarker 模板视图技术
log4j 日志管理
struts2-core 核心jar包
在web项目的WebContent下的WEB-INF下的web.xml中行进行配置
<filter>
<filter-name>struts2filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilterfilter-class>
filter>
<filter-mapping>
<filter-name>struts2filter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<welcome-file-list>
<welcome-file>这里写欢迎首页welcome-file>
welcome-file-list>
在src下新建struts.xml的文件
加入文件声明,然后配置文件
配置xml文件提示(如果有网络支持则不需要):
讲strruts-2.5.dtd文见另存在当前项目下,然后再eclipse中进行如下配置
方法一;
不继承任何类也不实现任何借口
在该类中有一个如下方法
public String execute(){
return "返回的标志";
}
方法二:
实现Action接口
五大常量
1.success 执行器中执行正常,跳转成功页
2.none 不做跳转,一般用用于调试
3.input 显示校验不通过返回页面
4.error 显示错误输出页面
5.login 显示登录成功页面
@Override
public String execute() throws Exception {
return SUCCESS;
}
@Override
public void validate() {
//校验前端数据
}
方法三:
继承ActionSupport类
implements Action, 实现了Action接口,则5大常量和execute方法签名有效
Validateable, ValidationAware,对于服务器端数据校验提供了支持
TextProvider, LocaleProvider,对于国际化I18N、本地化L10N
Serializable序列化接口
重写该方法
@Override
public String execute() throws Exception {
return SUCCESS;
}
@Override
public void validate() {
//校验前端数据
}
1.属性驱动
定义一个类,其中属性对应输入域中的那么属性,并添加set/get方法
示例代码
页面输入域
"username" />
后台类
public class HelloAction {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
2.模型驱动
定义一个类实现ModelDriven泛型为JavaBean类
示例代码
页面输入域
"username" />
控制类
public class HelloActionDemo extends ActionSupport implements ModelDriven<UserBean> {
private static final long serialVersionUID = 1L;
private UserBean user=new UserBean();
@Override
public UserBean getModel() {
return user;
}
}
JavaBean
package com.tubo.service;
public class UserBean {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
3.对象驱动
定义一个类 生命出一个JavaBean的对象
输入域中name属性为 对象.属性
示例代码
页面输入域
"user.username" />
控制类
public class HelloActionDemo {
private UserBean user;
}
JavaBean
public class UserBean {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
<constant name="struts.action.extension" value="action"/>
url默认后缀为action
<constant name="struts.i18n.encoding" value="utf-8"/>
这部分设置在/org/apache/struts2/default.properties文件中保存着
name="aaa" extends="struts-default" namespace="/">
aaa为给包起的名字
struts-default继承的报名
namespace=""用于定义action地址的名空间,可以不配置,不配置则等价于 namespace=""
name="hello" class="com.tubo.service.HelloAction" >
hello为 页面提交的名称去掉后缀
com.tubo.service.HelloAction为 包名.类名
<result name="show">/WEB-INF/context/welcome.jspresult>
定义响应 show为exectue执行后返回的标志
/WEB-INF/context/welcome.jsp 需要跳转的也面位置
//逐个进行配置
<package name="default" extends="struts-default" strict-method-invocation="false">
<action name="add" class="com.tubo.service.HelloDemoAction" method="add">action>
<action name="del" class="com.tubo.service.HelloDemoAction" method="del">action>
<action name="user" class="com.tubo.service.HelloDemoAction" method="user">action>
<action name="find" class="com.tubo.service.HelloDemoAction" method="find">action>
<action name="hello" class="com.tubo.service.HelloAction">
<result name="show">/WEB-INF/context/welcome.jspresult>
action>
方法二
//模糊配置
<package name="default" extends="struts-default" strict-method-invocation="false">
strict-method-invocation设为false关闭严格匹配
<action name="*" class="com.tubo.service.HelloAction" method="{1}">
//前面name所对应的模糊匹配和后面method的{1}相对应
<result name="show">/WEB-INF/context/welcome.jsp</result>
</action>
</package>
方法三
<action name="*_*" class="com.tubo.service.{1}Action" method="{2}">action>
//第一个*对应类名,第二个*对应方法名
建议在开发阶段打开,部署阶段关闭
//方法一
<filter>
param>
<param-name>struts.configuration. xml.reloadparam-name>
//自动发现并加载修改的 struts.xml 之类的配置文件
<param-value>trueparam-value>
param>
<param-name>struts.i18n.reload param-name>
//自动发现并加载修改的properties文件
<param-value>trueparam-value>
param>
filter>
//方法二(相当于以上俩个方法)
<filter>
param>
<param-name>struts.devModeparam-name>
<param-value>trueparam-value>
param>
filter>
在result的type属性中进行定义
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
<result-type name="redirect" class="org.apache.struts2.result.ServletRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.result.StreamResult"/>
这里写代码片
,一般建议将所有的jsp页面定义在/WEB-INF/content/文件夹下,这样可以保护页面的访问
struts中路径配置如下
< result name=”success”>/WEB-INF/content/user/welcome.jsp< / resault>
方法一:
Action中定义方法进行校验
前面已经引入了execute()方法对应的校验方法vaildate(),其实还可以定义Action中单个方法对应的校验方法
//命名规则vaildate+方法名
//例如要给login方法添加校验方法 方法名应为vaildateLogin()
在执行login方法之前会执行vaildate()方法[通用,每个方法之前都会调用此方法进行校验]
和vaildateLogin()方法
方法二;
配置文件校验
Xml校验规则文件对应的dtd文件位于struts2-core.jar中/xwork-validator-1.0.3.dtd
校验子说明文件—规定验证的名称
Struts2-core.jar中com/opensymphony/xwork2/validator/validators/ default.xml\
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="creditcard" class="com.opensymphony.xwork2.validator.validators.CreditCardValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
针对某个Action类进行校验
命名规则 类名-vaildate.xml
//例如针对HelloAction类进行校验的xml应命名为 HelloAction-vaildate.xml
针对某个url进行校验
命名规则 类名-url-vaildate.xml
//例如针对HelloAction类的hello.action地址进行的校验 HelloAction-hello-vaildate.xml
validate配置文件的属性解析
<validators>
<field name="username"需要验证的输入域名称>
<field-validator type="填写需要的验证" short-circuit="true"给属性指定为true即表示前面验证不通过不进行后续验证>
<message>用户名不允许为空!(报错信息)message>
field-validator>
field>
<validators>
事实上xwork对客户端校验也提供了支持,只需要在标签中添加属性validate=true即可
方法一:
通过ActionContext工具类获取的就是attribute:
public String execute() {
ActionContext context = ActionContext.getContext();
context.put("", "");
return "show";
}
方法二:
使用工具类ServletActionContext可以直接获取Servlet API对象
PageContext pageContext = ServletActionContext.getPageContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext servletContext = ServletActionContext.getServletContext();
ActionContext context2 = ServletActionContext.getContext();
方法三:
在Action类声明上使用xxxAware接口,由框架负责注入所需要的对象
public class HelloAction implements ServletRequestAware{
private ServletRequest request;
public String execute() {
return "show";
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request=arg0;
}
}
一:上传
在页面的输入域中定义的那么属性值在action中应该定义三个属性与之对应
例如
页面
"photo" >
Action中应该定义以下三个属性
private File photo;//用于表示上传文件的对象名称
private String photoFileName;//用于表示上传文件在客户端的名称
private String photoContentType;//用于表示上传文件的类型
if(photo!=null&&photo.length()>0) throws Exception {
String path = application.getRealPath("文件存放路径");
File ff = new File(path,"新文件名");
FileUtils.copyFile(photo, ff);//将文件拷贝到服务器文件夹下
}
在struts中设置文件上传拦截器
ref name="fileUpload">
name="maximumSize">204800
name="allowedExtensions">jpg,png,pif
name="">
ref>
由于报错信息为英文,处理为在struts中配置全局参数
<constant name="struts.custom.i18n.resources" value="msg" />
并且在src的根目录下创建文件msg.properties
内容修改为相关的中文报错信息
struts.messages.error.file.too.large=大小不对应的报错信息
struts.messages.error.file.extension.not.allowed=文件格式不匹配的报错信息
二:下载
页面
将<img>表情嵌套在<a>标签中
<a href="download.action?filename=${mm}">
<img src="upload/${mm}">a>
Action
private String filename;
public String execute() throws Exception {
response.resetBuffer();//刷新缓冲区
response.setHeader("Content-disposition", "attachment;filename="+filename);
//设置响应头
byte[] buf=new byte[8192];
int len=0;
String path = application.getRealPath("upload");
File ff = new File(path, filename);
ServletOutputStream os = response.getOutputStream();
if(ff.exists()) {
FileInputStream is = new FileInputStream(ff);
while((len=is.read(buf))>0) {
os.write(buf, 0, len);
}
is.close();
os.close();
}
return NONE;
}
标签
访问Action中的普通属性: value="attrName"/>
访问Action中的对象属性(要有get set方法): value="obj.attrName"/>
访问对象属性的方法 value="obj.methodName()"/>
访问值栈中action的普通方法: value="methodName()"/>
defaule //表示不能获取到值是所显示的属性
escapeHtml //用于设置是否将所包含的html标签转换为实体字符
value //用于表示ognl表达式所显示的值
if标签>
用于进行条件判断,可以单独使用也可以配合else>elseif使用>
#parameters是struts2中OGNL所使用的默认对象,用于获取请求参数,获取方法类似于request.getParameterValues():String[]
if value="#parameters.属性值>85">优秀if>
用于实现迭代访问集合
value 用于获取被跌代的对象
var 指定元素集合中元素的临时变量
stauts 用于表示跌代对象的状态
生成一个url地址,可以通过url标签制定的<s:param>子元素向URL地址发送请求参数
<s:url var=”变量名称” action="对应的action名称"> 指定请求地址
<s:param name="参数名称" value="OGNL表达式,获取参数的值"/>指定参数
a> 用于生成a标签
默认的href会指定默认的地址值 如果使用ognl表达式则需要指定的格式 %{ognl表达式}进行强制计算
a href="login.action">