Struts2

来源:互联网 发布:it 电影 编辑:程序博客网 时间:2024/06/05 23:52

form:http://m.oschina.net/blog/16160

1.配置web.xml文件添加struts2过滤器:

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class></filter><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping>
  2.任何一个POJO都可以作为Action类,只要提供public String execute()方法。
但通常情况下,我们所写的action类会继承ActionSupport(Action接口的实现类)。
在Action接口中定义的五个终态静态常量,也就是Action的五个返回值:
SUCCESS:执行成功,向用户显示成功页面
NONE:执行成功,但不需要向用户显示结果页面
ERROR:执行失败要向用户显示失败页面
INPUT:执行需要用户输入更多信息(验证不通过),要向用户显示输入页面
LOGIN:由于用户没有登录,action不能执行,要向用户显示登录页面
虽然返回值名字仍可以自己指定,但是不建议。
3.对struts.xml的配置(存放于classes目录下):
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.1.dtd"><struts><package name="struts2" extends="struts-default"><action name="index" class="com.myblog.action.WelcomeAction"><result name="success">/test/index.jsp</result></action></package></struts>


  4.如果Action中有对POJO的引用,则在表单中因使用POJO名.属性名的方式
Ex:<input type"text" name="user.username">
甚至<input type"text" name="user.city.citycode">

  5.表单提交后,struts2首先尝试获得User对象的引用,当它发现User对象为null时,它将使用User类的默认构造方法,创建一个User实例,并调用action的set方法设置这个实例。

6.在struts2中,支持直接使用领域对象DO来接收用户输入的数据
  模型驱动:
    然而struts2提供了另外一种直接使用领域对象的方式,就是让Action实现ModelDriven<T>接口,模型驱动(MD)可以让我们直接操作应用程序中的领域对象,允许我们在Web层和业务层使用相同的对象。
ModelDriven接口中只有一个方法: public T getModel(),该方法返回一个模型对象压入值栈除了Action自己。
  如此一来,在页面中,这个模型对象中的属性可以直接通过属性名来访问,而不需要使用下标访问符来访问(如user.username),这时也不需要为中国模型对象提供JavaBean风格的getter和setter方法。
public class LoginAction implements ActionSupport,ModelDriven<User>{ private User user = new User(); @Override public String execute() throws Exception{ ......省略 }  @Override public User getModel(){ return User; }}
这样在页面中:
Ex:<input type"text" name="username">
  <s:property value="username">
何时直接使用DO,何时应该实现MD接口,这两种方式并没有本质上的区别,对于大多数的应用而言,任何一种方式都可以。

7.struts2访问request,session,application对象
  与Servlet API解耦的访问方式:(为了方便Action类做单元测试,Struts2对HttpServletRequest,HttpSession,ServletContext进行了封装,构造了三个Map对象来替代这三种对象)
非IOC方式:
要获取这三个Map对象,可以使用ActionContext类,它是Action执行的上下文,在ActionContext中保存了Action执行所需的一组对象,包括parameters,request,session,application,locale等
根据API文档内的方法,在Action中:
 ActionContext context = ActionContext.getContext();   //Returns the ActionContext specific to the current thread. Map request = (Map)context.get("request"); Map session = context.getSession(); Map application = context.getApplication();
并可以使用Map类型的put("key",value)方法赋值。
ActionContext中保存的数据能够从请求对象中得到,在于StrutsRequestWrapper类(它是HttpServletRequest的包装类),重写了getAttribute()方法(在页面中request对象的属性就要用这个方法调用),在这个方法中,先在request对象中查找属性,如果没有则在ActionContext中查找。
IOC方式:
通过实现RequestAware,SessionAware,ApplicationAware接口,并实现public void serXXX(Map XXX)方法,有struts2容器注入,当然需先声明Map类型的属性。
  与Servlet API耦合的访问方式:
非IOC方式:
 HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); ServletContext context = ServletActionContext.getServletContext();
IOC方式:
实现ServletRequestAware,ServletContextAware接口,并实现set方法