Struts2的控制组件:
核心控制器:过滤器(struts2提供的一个过滤器,由web.xml的filter和filter-mapping设置)。
控制组件类型:业务逻辑控制器Action。
核心控制器的配置
<!--定义struts2的核心Filter--> <filter> <filter-name>struts2</filter-name> <!--Struts2.1.3版本起使用的核心过滤器--> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <!--让Struts2的核心Filter拦截所有请求--> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
如果只拦截.action文件,则设置为:<url-pattern>*.action</url-pattern>
业务逻辑控制器Action
步骤:
- 创建Action类
- 创建struts.xml配置包、动作等
1.Action处理请求参数方法
1.1属性驱动
使用属性作为贯穿MVC流程的信息携带者,依附于Action实例,Action实例封装请求参数和处理结果。属性驱动有三种:普通POJO类、实现Action接口、继承ActionSupport。
这是Action接口的声明常量,扩展ActionSupport类后可以直接拿来用
Action接口中的常量返回值含义:
–ERROR:表示动作类执行失败。
–SUCCESS:表示动作类执行成功,并将由相关的视图页面显示结果 。
–LOGIN:表示需要先登录才可以执行动作 。
–INPUT:表示需要输入全部数据才能执行动作或数据输入无效需重新输入 。
–NONE:表示动作类执行成功,但不显示任何页面。
语法要求:
–请求参数为基本数据类型。
–Action类中声明和请求参数名及类型一致的变量。
–在Action类中定义与请求参数名一致的基本数据类型的属性的setter和getter方法
案例:
<form action=”login.action” method=”post”> 用户名:<input type=”text” name=”username” /> 密 码:<input type=”password” name=”password” /> <input type=”submit” value=”登录” /> </form> |
在Action中声明成员变量,成员变量名与表单项name属性一致;
//1. 继承ActionSupport类 public class LoginAction extends ActionSupport { //2. 声明成员变量(与表单项name一致,这里最好是私有化一个实体类对象,参见后面的) private String username; private String password; //3. 封装,省略getter/setter方法 //struts2的拦截器机制,getter/setter方法负责解析用户请求参数,并且将请求参数值赋给action对应的属性
public String execute() throws Exception { if("test".equals(getUsername()) && "123".equals(getPassword())){ return SUCCESS; }else{ return ERROR; } } } |
1.2模型驱动(对象)
就是使用单独的JavaBean实例来贯穿整个MVC流程,JavaBean实例封装请求参数和处理结果。模型驱动有一种:ModelDriven。
语法要求:
–创建域对象类,其中属性和参数名一致。
–请求参数格式为:域对象.基本数据类型属性。
–Action类中声明和域对象名字和类型一致的变量。
–在Action类中定义与域对象一致类型和名字的属性的setter和getter方法。
案例:
<form action=”login.action” method=”post”> 用户名:<input type=”text” name=”user.username” /> 密 码:<input type=”password” name=”user.password” /> <input type=”submit” value=”登录” /> </form> |
创建表单实体类:
public class User{ private String username; private String password; --省略setter/getter-- } |
Action:
//1. 实现ModelDriven接口 public class LoginAction implements ModelDriven<User> { //定义用于封装请求参数和处理结果的Model private User user = new User(); //2. 实现接口的getModel()方法,并把创建对象返回 @Override public User getModel() { return user; }
//4. 在execute()中使用对象 public String execute() throws Exception { if("test".equals(user.getUsername()) && "123".equals(user.getPassword())){ return SUCCESS; }else{ return ERROR; } } } |
2在struts.xml中配置包和动作
2.1<package>
包,可以包含多个动作。
常用属性:
案例:
<action name="login" class="com.zking.action.LoginAction" method="isVerificationUser"> …… </action> |
2.2<result>
定义动作结果,对Action的结果进行映射。
常用属性:
案例:
<action name="login" class="com.zking.action.LoginAction" method="isVerificationUser"> <result name="error">/input.jsp</result> <result name="success" type="redirect">/welcome.jsp</reslut> </action> |
2.3Action访问servlet api
Struts2提供了一个ActionContext类(com.opensymphony.xwork.ActionContext),它是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放的是Action在执行时需要用到的对象。可以通过下面方法访问Servlet API:
Object get(key) | 类似于HttpServletRequest的getAttribute(String) |
Map getApplication() | 返回一个Map对象 |
static ActionContext getContext() | 返回静态的ActionContext实例,相当于HttpServletRequest对象 |
Map getParameters() | 获取所有的请求参数,返回Map对象 |
Map getSession() | 返回一个Map对象 |
void setApplication(Map) | 向application传入一个Map对象 |
void setSession(Map) | 向session传入一个Map对象 |
void put(key, value) | 添加对象 |
如何获得地址栏参数、表单参数:(struts版本不一样使用也不一样)
ActionContext context = ActionContext.getContext();
// 得到HttpServletRequest对象的attribute(解耦) Map<String, Parameter> paramsMap = context.getParameters(); String type = paramsMap.get("type").toString();
Map<String, Parameter> paramMap = ActionContext.getContext().getParameters(); Parameter s = paramMap.get("type"); System.out.println(s.toString());
// 得到request对象 HttpServletRequest request = (HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST); String type2 = request2.getParameter("type"); |
获得servlet对象:
ActionContext ac = ActionContext.getContext(); // map的key就是表单项的各name Map<String, Object> map = ac.getParameters(); //查看Map中的数据 Set<String> keys = map.keyset(); for(String key : keys){ Object[] obj = (Object[])map.get(key); System.out.println(Arrays.toString(obj)); } |