1. Struts2所需要的基础jar文件
struts2-core-xxx.jar(xxx代表的是版本)
xwork-core-xxx.jar
ognl-xxx.jar
freemarker-xxx.jar
javassist-xxx.GA.jar
commons-fileupload-xxx.jar
commons-io-xxx.jar
commons-lang-xxx.jar
Action类的属性应和jsp页面的name属性保持一致,在Struts2中,可以直接使用Action类的属性来接收用户的输入,当表单提交时,
Struts2自动对请求参数进行转换,并对具有相同名字的Action属性进行赋值(通过setter方法)。
通常在开发过程中,我们用实体对象来保存信息,在Action中也可以使用JavaBean来接收用户输入,在Action类里声明JavaBean对象
并封装,jsp页面的表单的name属性的值写 JavaBean对象.属性 就可以了,比如Action类中有一个user对象的属性,在jsp页面的表
单里的那么name属性写成 <input name="user.name" /> 即可
Action中也可以使用复杂属性,如数组,类,集合对象等。
实现Action的方式:
1. 实现com.opensymphony.xwork2.Action接口,同时要实现这个接口中的execute()方法。所有用于处理请求的方法必须返回
一个字符串类型的逻辑结果。
Action接口中定义的五个字符串类型的静态常量:
常量 值 逻辑含义
SUCCESS "succes" 表示程序处理正常,并返回给用户成功后的结果
NONE "none" 表示处理正常结束,但不返回给用户任何显示
ERROR "error" 表示处理结果失败
INPUT "input" 表示需要更多用户输入才能顺利执行
LOGIN "login" 表示需要用户正确登录后才能顺利执行
struts2应用的执行流程:
(1) 浏览器发出请求到服务器
(2) 服务器接收请求,根据web.xml的配置,将请求发送给指定的Struts2过滤器
(3) 过滤器根据struts.xml的配置内容,将请求发送给对应的Action类的对象,并调用默认的execute()方法
(4) 根据execute的返回结果,在struts.xml文件中匹配处理结果,进行页面跳转
(5) 页面根据上下文的内容,借助ognl表达式和Struts2标签将内容显示在页面中
Struts2访问Servlet API 对象
一.与Servlet API解耦的访问方式
①使用ActionContext类获取Servlet API 对象对应的Map
ActionContext是Action执行的上下文,在ActionContext中保存了Action类对象执行所需要的一组对象。
public Object get(Object key) : 通过此方法获取HttpServletRequest,HttpSession,ServletContext对应的Map对象
示例:
ActionContext ac=ActionContext.getContext();//得到上下文
Map request=(Map)ac.get("request");//得到HttpServletRequest对象对应的Map对象
public Map getSession() : 获取对应HttpSession对象的Map对象
示例:
ActionContext ac=ActionContext.getContext();//得到上下文
Map session=ac.getSession();
public Map getApplication() : 获取对应ServletContext对象的Map对象
示例:
ActionContext ac=ActionContext.getContext();//得到上下文
Map application=ac.getApplication();
②Struts2向Action注入Servlet API对象对应的Map对象
可以借助实现特定接口来直接获取Sevlet API对象,即采用注入的方式实现
Struts2提供了以下接口:
org.apache.struts2.interceptor.RequestAware : 向Action实例中注入HttpServletRequest对象对应的Map对象,
这个接口只有一个方法 : public void setRequest(Map<String,Object>request);
org.apache.struts2.interceptor.SessionAware : 向Action实例中注入HttpSession对象对应的Map对象,
这个接口只有一个方法 : public void setSession(Map<String,Object>session);
org.apache.struts2.interceptor.ApplicationAware : 向Action实例中注入servletContext对象对应的Map对象,
这个接口只有一个方法 : public void setSession(Map<String,Object>application);
使用Action直接访问Servlet API这种方式相对于使用ActionContext访问Servlet API这种方式更有利于单元测试。因为ActionContext需要
借助框架进行初始化,Action可以直接设置测试数据,更加方便。
二. 与Servlet API耦合的访问方式
直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。在这个类中定义了以下
的方法来获取Servlet API对象:
public static HttpServletRequest getRequest(); //得到HttpServletRequest对象
public static ServletContext getServletContext(); //得到ServletContext对象
public static HttpServletResponse getReponse(); //得到HttpServletReponse对象
注意: ServletContext类并没有定义获得HttpSession对象的方法,HttpSession对象可以通过HttpServletRequest对象来得到。
除了使用ServletActionContext来直接获取Servlet API对象,Action类还可以实现特定的接口,由Struts2框架向Action实例注入
Servlet API对象。
org.apache.struts2.util.ServletContextAware接口—— :向Action实例中注入ServletContext对象,这个接口中只有一个方法:
public void setServletContext(ServletContext context);
org.apache.struts2.util.ServletRequestAware接口—— :向Action实例中注入HttpServletRequest对象,这个接口中只有一个方法:
public void setServletRequest(HttpServletRequest request);
org.apache.struts2.util.ServletResponseAware接口—— :向Action实例中注入HttpServletResponse对象,这个接口中只有一个方法:
public void setServletResponse(HttpServletResponse response);
Struts2数据校验
让Action类继承ActionSupport类,重写execute()方法,并重写validate()方法,在此方法中调用addFieldError()方法添加校验信息。校验通过则会继续往后面执行
校验不通过,则会在后台返回一个input的字符串。
如示例:
@Override
public void validate(){
if(this.getUser().getUsername()==null || this.getUser().getUsername().length()==0){
addFieldError("name", "用户名不能为空");
}
if (this.getUser().getPassword()==null||this.getUser().getPassword().length()==0) {
addFieldError("pwd", "密码不能为空");
}
}
注意; 要在struts.xml文件中配置一个input字符串的返回结果,否则会报错。
如: <action name="login" class="cn.ssh.ch08.LoginAction">
<!-- 结果为"input"时,跳转至login.jsp页面-->
<result name="input">/login.jsp</result>
</action>
Struts2标签:分为UI标签,通用标签。使用前要导入标签库
<%@taglib prefix="s" uri="/struts-tags" %>
常用表单标签 :
<s:form>....</s:form> 获取相应form的值
<s:textfield>..</textfield/> 文本输入框
<s:password>...</s:password> 密码输入框
<s:textarea>...</s:textarea> 文本域输入框
<s:radio>...</s:radio> 单选按钮
<s:checkbox>...><s:checkbox/> 复选框
<s:submit>...</s:submit> 提交按钮
<s:reset>...</s:reset> 重置按钮
<s:hidden>...</s:hidden> 隐藏域标签
在jsp页面可以通过<s:fielderror>标签来输出校验信息。
<s:fielderror> : 输出所有的校验信息。
<s:fielderror fieldName="pwd"/> : 输出add addFieldError()方法key为pwd的属性在校验信息。
通用标签
条件标签 :<s:if>...</s:if>
<s:elseif>...</s:elseif>
<s:else>...</s:else>
这三个标签只有<s:if>可以单独使用,三个标签可以组合在一起使用,但是<s:elseif>和<s:else>不能单独使用。<s:if>标签可以和
多个<s:elseif>标签结合使用,但是只能与一个<s:else>标签组合在一起。
iterator迭代标签
语法如下:
<s:iterator value="集合对象" status="stutus" id="name">
读取集合对象并输出显示
</s:iterator>
vlaue属性: 表示需要进行遍历的集合对象
status属性: 当前迭代元素,用这个属性可以来判断当前后迭代元素的属性。如元素的索引
id属性: 表示当前迭代元素的id,使用这个id可以直接访问到当前的迭代元素。