Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller),像servlet中的Filter管理用户请求,建立模型与视图的数据交互。
实际上struts在web的配置文件中就是以过滤器filter的形式配置的。
ONGL表达式:就是对象图形化导航语言,在前端页面中,访问action的属性
interceptor拦截器
工作流程:
(1)客户端浏览器发送HTTP请求到Web应用
(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。
(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器
(4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理
(5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象
(6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result
(7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应
(8)HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端
配置文件
1.Default.properties struts的一些默认配置
2.Struts-default.xml struts关系类和拦截器的默认设置
3.Struts-plugin.xml
4.Struts.xml 用户配置的struts工程配置文件
5.web.xml
struts配置文件
1 package元素,一个配置文件只有一个,相当于一个struts项目。
属性 name,namespace,extends,abstruct。
namespace主要是与action标签的name属性联合使用来确定一个 action的访问路径,及在浏览器的访问路径,默认不配。
extends, 一般值是struts-default,struts-default包是 在struts-default.xml文件中声明的。
2 action元素,name,class,method,一个action对应处理一个请求,及链接,package下可以有多个action。
name属性为a标签的超链接href的值,去除后缀。
class属性是处理请求所需要的类,及类的全路径,从package开始。
method,该类处理的方法,默认方法为execute.
3 result元素,action元素的子元素,name,type属性。
name及根据方法设置的放回值,默认是SUCCESS字符串,与action中的method方法的返回值匹配。
type属性是跳转的方法,比如重定向,转发。
action标签对应的ACTION类要求。
ACTION类是一个POJO类,struts通过反射机制建立类,所以要给所有类的属性提供getter,setter的方法,以及无参的构造器。
struts为每一个HTTP请求创建一个action类的实例,所以action类是线程安全的。
ACTION类获取servlet的相关属性,如request,reponse等属性的方法。
1
action类继承了ActionSupport
servletActionContext获取
request: ServletActionContext.getRequest();
response: ServletActionContext.getResponse();
servletContext: ServletActionContext.getServletContext();
2
采用注入的方式
Struts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor,默认执行的拦截器是struts-default.xml文件中定义的。
ServletRequestAware, 实现这个接口可以获取HttpServletRequest;
ServletResponseAware ,实现这个接口可以获取HttpServletResponse;
ServletContextAware 实现这个接口可以获取ServletContext;
属性封装
struts会将请求页面中的输入类型标签或者其余标签的name值,根据配置文件的配置,在创建相应的ACTION类时,根据ACTION类的属性同名为它赋予值。
application, session,parameter等对象都以map方式存储在actioncontext对象中,其中get(‘request’)方式获取request。
模型驱动
将ACTION类的所以属性提取出来形成一个实体类,包装成Model,在本ACTION类中不用setter,getter方法,而是通过实体类的setter,getter方法注入属性,ACTION类调用实体类方法,使用属性。
实体类要成为ACTION类的属性,并在ACTION类中用new 创建一个实例。
ACTION类实现ModelDriven<Object>接口,Object及实体类。
3 public class User {
4 private String userName;
5 private String pwd;
6 public String getUserName() {
7 return userName;
8 }
9 public void setUserName(String userName) {
10 this.userName = userName;
11 }
12 public String getPwd() {
13 return pwd;
14 }
15 public void setPwd(String pwd) {
16 this.pwd = pwd;
17 }
18 }
19 //--------action---------------------------------
21
22 import java.util.ArrayList;
23 import java.util.List;
24
25 import com.opensymphony.xwork2.ActionSupport;
26 import com.opensymphony.xwork2.ModelDriven;
27
28 public class UserAction extends ActionSupport implements ModelDriven<User>{
29
30 private User user = new User();
31 public User getUser() {
32 return user;
33 }
34 public void setUser(User user) {
35 this.user = user;
36 }
37 public User getModel() {
38 return this.user;
39 }
40 public String add(){
41 List<Object> list = new ArrayList<Object>();
42 list.add(user);
43 return SUCCESS;
44 }
45 }
OGNL表达式
1 要求struts处理的请求是\*,不能是.action,.do而已
2 在页面插入<%@ taglib uri="/struts-tags" prefix="s"%>
3 使用OGNL
valueStack(值栈)
valueStack的主要目的是为action中产生的数据携带到页面上,也就是说valueStack它就是一个容器,在Struts2框架中将valueStack设计成一个接口,当客户端向我们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题,一个valueStack对应一个action,valueStack贯穿整个action的生命周期,struts2框架将valueStack保存在request中。
valueStack主要有两部分组成:
CompoundRoot:它就是一个ArrayList它主要存储的是action的相关数据;
Map<String,Object> context:就是一个Map,Context中主要存储了一些引用,这个引用主要是关于web开发中相关信息;
pameters :请求参数;
request:请求对象中所有属性;
session:会话对象中所有属性;
application:application对象中的所有发展;
获取ValueStack
(1) 通过request对象来获取;
ValueStack vs = (ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);
(2) 通过ActionContext来获取
ValueStack vs = ActionContext.getServletContext()getValueStack();
Interceptor拦截器
<s:debug></>在页面加上这行代码,可以查看属性状态
文件上传
<s:form action="fileaction" method="post" enctype="multipart/form-data">
<s:file name="text" label="text"></s:file>
<s:textfield name="wenben" label="wenben"></s:textfield>
<s:submit></s:submit>
</s:form>
文件上传的ACTION中要有三个基本属性。
1 文件对象File
2 文件的类型FileContentType
3 文件的名字FileName
其中文件对象在action要和表单的file中的name相同,其余两个命名遵守[file-name]ContentType,[file-name]FileName,方式命名。
然后在struts.xml文件配制相应的ACTION即可,在配置result时,struts默认上传或下载出错,会内部返回一个INPUT视图,所有可以设置一个result的name=’input’,当请求资源出错时,直接跳转相应的页面。
public class Upload extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private File text;
private String wenben;
private String textFileName;
private String textContentType;
public Upload() {
}
。。。。。。
}public String execute() throws Exception{
try {
System.out.println(this);
ServletContext application=ServletActionContext.getServletContext();
String filePath=application.getRealPath("/file");//获取真实目录
System.out.println(filePath);
File file=new File(filePath);//在真实目录下创建一个新的文件
if (!file.exists()) {
file.mkdirs();
}
text.renameTo(new File(file,textFileName));
}
catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return ERROR;
}
文件上传成功后,要立即保存,不然struts的过滤器将会删除文件。
文件的下载
文件的下载提供一个ACTION类获取文件的类型,长度,响应头三个重要的信息,无需多余的视图页面,除了INPUT出错视图。
在配置文件中设置result的type类型改成stream,再action中设置超链接的name值。
此结果类型采用以下参数:
contentType-发送到Web浏览器的流mime类型(默认= text/plain)。
contentLength-流的长度(以字节为单位)(浏览器显示进度条)。
contentDisposition-用于指定文件名的内容处置标头值(默认= inline,值通常是 附件; filename =“ document.pdf”。
inputName-链式操作中InputStream属性的名称(默认= inputStream)。
bufferSize-从输入复制到输出的缓冲区的大小(默认= 1024)。
allowCaching如果设置为“ false”,则会将标头“ Pragma”和“ Cache-Control”设置为“ no-cahce”,并防止客户端缓存内容。(默认= true)
只有前三个参数需要动态提供,后两个可以再配置文件中设置。
//配置文件的配置
<action name="load" class="mc.Down" method="execute">
<result type="stream">
<param name="bufferSize">2048</param>
</result>
</action>
//下载ACTION类
public class Down extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
private String contentType;
private long contentLength;
private String ContentDisposition;
private InputStream inputStream; //默认
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public long getContentLength() {
return contentLength;
}
public void setContentLength(long contentLength) {
this.contentLength = contentLength;
}
public String getContentDisposition() {
return ContentDisposition;
}
public void setContentDisposition(String contentDisposition) {
ContentDisposition = contentDisposition;
}
public InputStream getInputStream() {
return inputStream;
}
@Override
public String execute() throws Exception{
contentType="text/html";
ContentDisposition="attachment;filename=kk.html";//attachment固定,
ServletContext servletContext=ServletActionContext.getServletContext();
String path=servletContext.getRealPath("/file/kk.html");
inputStream=new FileInputStream(path);
inputStream.available();
return SUCCESS;
}
}