struts2--2.Action

    xiaoxiao2021-03-25  94

    类似servlet

    1.1   内容

    1 结果页面配置

    (1)全局结果页面

    (2)局部结果页面

    - 配置全局也配置局部,最终局部为准

     

    (3)result标签type属性

    - 默认值 dispatcher做转发

    - redirect做重定向

    - chain:转发到action

    - redirectAction:重定向到action

     

    2在action获取表单提交数据

    (1)使用ActionContext类获取

    (2)使用ServletActionContext类获取

    (3)使用接口注入方式获取

    - 使用ServletActionContext类操作域对象

     

    3 struts2提供获取表单数据方式

    (1)属性封装

    - 定义变量,变量和表单输入项name属性值一样,生成get和set方法

    (2)模型驱动封装(重点)

    - 实现接口,实现接口里面的方法,表单输入项name属性值和实体类属性名称一样

    (3)表达式封装

    (4)表达式封装和模型驱动封装比较

    - 相同点:可以把数据封装到实体类对象里面

    - 不同点:表达式封装可以封装到不同的实体类里面

     

    4 struts2获取数据封装到集合中(会用)

    (1)封装到list集合

    (2)封装到map集合

     

    5 案例-添加客户功能

     

    2      结果页面配置

    2.1  全局结果页面

    1 result标签配置action方法的返回值到不同的路径里面

     

    2 创建两个action,执行默认的方法execute方法,让两个action的方法都返回success,返回success之后,配置到同一个页面里面

    (1)如果多个action,方法里面返回值相同的,到页面也是相同的,这个时候可以使用全局结果页面配置

    <package name="demo1" namespace="/"extends="struts-default"> <action name="book"class="struts.action.BookAction"> <result name="success">/hello.jsp</result> </action> <action name="orders"class="struts.action.OrdersAction"> <result name="success">/hello.jsp</result> </action> </package> 

    (2)在package标签里面配置

    <!-- 全局結果頁面配置 --> <global-results> <result name="success">/hello.jsp</result> </global-results> <action name="book"class="struts.action.BookAction"></action> <action name="orders"class="struts.action.OrdersAction"></action> 

    2.2  局部结果页面

           配置全局页面,也配置了局部页面,最终以局部配置为准

    2.3  Result标签的type属性

    type属性:如何到路径里面(转发还是重定向)

           一般针对到页面中配置:dispatcher,redirect

           配置到其他的action里:chain,redirectAction

     

    2.3.1      默认值,做转发操作,值是 dispatcher

    2.3.2      做重定向操作,值是 redirect

    2.3.3      配置到其他的action里面

    - chain:转发到action,一般不用,缓存问题

    - redirectAction:重定向到action

     

    2.4  DynamicResult动态结果集—了解

     <package name="user"namespace="/user" extends="struts-default">

    <action name="user" class="com.bjsxt.struts2.user.action.UserAction"> <result>${r}</result> </action> </package>

    @Override public String execute() throws Exception { if(type == 1) r="/user_success.jsp"; else if (type == 2) r="/user_error.jsp"; return "success"; } 

    2.5  带参数的结果集

    <action name="user"class="com.bjsxt.struts2.user.action.UserAction"> <result type="redirect">/user_success.jsp?t=${type}</result> </action> <li><a href="user/user?type=1">传参数</a></li>

    3      Action获取表单提交数据

    1 之前web阶段,提交表单到servlet里面,在servlet里面使用request对象里面的方法获取,getParameter,getParameterMap

     

    2 提交表单到action,但是action没有request对象,不能直接使用request对象

     

    3 action获取表单提交数据主要四种方式

    (1)使用ActionContext类—解耦

    (2)使用ServletActionContext类

    (3)使用接口注入方式(原生,)

     

    3.1  使用ActionContext类获取

    (1)因为方法不是静态的方法,需要创建ActionContext类的对象

    (2)这个ActionContext类对象不是new出来的,

    (3)Action执行的上下文对象, 在 ActionContext 中保存了Action 执行所需要的所有对象, 包括 parameters, request, session, application

     

    1 具体演示

    (1)创建表单,提交表单到action里面

    (2)在action使用ActionContext获取数据

    public String execute() throws Exception { //第一种方式使用ActionContext类获取 //1 获取ActionContext对象 ActionContextactionContext = ActionContext.getContext(); //2 调用方法得到表单数据 // key是表单输入项name属性值,value是输入的值 Map<String, Object> map = actionContext.getParameters(); Set<String>keys = map.keySet(); for (String key : keys) { //根据key得到value //数组形式:因为输入项里面可能有复选框情况 Object[]obj = (Object[]) map.get(key); System.out.println(Arrays.toString(obj)); } return NONE; } 

    3.2  使用ServletActionContext类获取

           调用类里面静态方法,得到request对象

    public String execute() throws Exception { //第一种方式使用ServletActionContext类获取 //1 使用ServletActionContext获取request对象 HttpServletRequestrequest = ServletActionContext.getRequest(); //2 调用request里面的方法得到结果 Stringusername = request.getParameter("username"); Stringpassword = request.getParameter("password"); Stringaddress = request.getParameter("address"); System.out.println(username + ":" + password + ":" + address); return NONE; } 

    3.3  使用接口注入(了解)

    3.3.1      ServletXxxAware 接口.

           ServletRequestAware, ServletContextAware , ServletResponseAware

     

    public classForm3DemeAction extends ActionSupport implements ServletRequestAware{ private HttpServletRequest request; private HttpSession session; private ServletContext application; @Override public voidsetServletRequest(HttpServletRequest request) { this.request = request; this.session = request.getSession(); this.application = session.getServletContext(); } public String execute() { request.getParameter(""); request.setAttribute("",""); session.setAttribute("", ""); application.setAttribute("", ""); return NONE; } } 

    3.3.2      XxxAware接口—只用这种

    通过可以实现某些特定的接口, 让 Struts2 框架在运行时向 Action 实例注入 parameters, request, session 和application 对应的 Map 对象:

    RequestAware,SessionAware,ApplicationAware

    public classForm4DemeAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware { private Map<String,Object> request; private Map<String,Object> session; private Map<String,Object> application; public String execute() { request.put("r1", "r1"); session.put("s1", "s1"); application.put("a1", "a1"); return SUCCESS; } @Override public voidsetRequest(Map<String, Object> request) { this.request = request; } @Override public voidsetSession(Map<String, Object> session) { this.session = session; } @Override public voidsetApplication(Map<String, Object> application) { this.application = application; }

    3.4  补充:在action操作域对象

    1 request、session、servletContext域对象

    2 使用ServletActionContext类操作

    public class Form5DemeAction extends ActionSupport{ @Override public String execute() throwsException { //操作三个域对象 //1 request域 HttpServletRequestrequest = ServletActionContext.getRequest(); request.setAttribute("req", "reqValue"); //2 session域 HttpSessionsession = request.getSession(); session.setAttribute("sess", "sessValue"); //3 ServletContext域—了解 ServletContextcontext = ServletActionContext.getServletContext(); context.setAttribute("contextname","contextValue"); return NONE; } } 

    4      封装方式--封装实体类对象(3种)

    (1)属性封装

           定义变量,变量和表单输入项name属性值一样,生成get和set方法

    (2)模型驱动封装(重点)

           实现接口,实现接口里面的方法,表单输入项name属性值和实体类属性名称一样

    (3)表达式封装

           表达式封装和模型驱动封装比较,把表达式封装归类到属性封装里面

    - 相同点:可以把数据封装到实体类对象里面

    - 不同点:表达式封装可以封装到不同的实体类里面

     

    首先创建实体类:

     

    4.1  原始方式获取表单封装到实体类对象

    public classForm1Action extends ActionSupport{ public String execute() throws Exception { //1.获取表单数据 HttpServletRequestrequest = ServletActionContext.getRequest(); Stringusername = request.getParameter("username"); Stringpassword = request.getParameter("password"); Stringaddress = request.getParameter("address"); Useruser = newUser(); user.setUsername(username); user.setPassword(password); user.setAddress(address); System.out.println(user.toString()); return NONE; } }

    4.2  属性封装(会用)

    1 直接把表单提交属性封装到action的属性里面

     

    2 实现步骤

    (1)在action成员变量位置定义变量

           变量名称和表单输入项的name属性值一样

    (2)生成变量的set方法(把set和get方法都写出来)--action层里

    3 使用属性封装获取表单数据到属性里面,不能把数据直接封装到实体类对象里面

    //属性封装 public class DataDemo2Action extends ActionSupport{ //1定义变量 //变量的名称和表单输入项name属性值一样 private String username; private String password; private String address; //2 生成变量的set和get方法 public String getUsername() { return username; } public void setUsername(Stringusername) { this.username = username; } public String getPassword() { return password; } public void setPassword(Stringpassword) { this.password = password; } public String getAddress() { return address; } public void setAddress(Stringaddress) { this.address = address; } @Override public String execute() throws Exception { System.out.println(username+":"+password+":"+address); returnNONE; } }

    4.3  模型驱动封装(重点)

    1 使用模型驱动方式,可以直接把表单数据封装到实体类对象里面

     

    2 实现步骤

    表单输入项name属性值实体类属性名称一样

    (1)action实现接口 ModelDriven

    (2)实现接口里面的方法 getModel方法

    - 把创建对象返回

     

    (3)在action里面创建实体类对象

    //模型驱动封装 public class DataDemo3Action extends ActionSupport implements ModelDriven<User>{ //创建对象 //前提要求: 表单输入项name属性值 和 实体类属性名称一样 private User user = new User(); public User getModel() { //返回创建user对象 return user; } @Override public String execute() throws Exception { System.out.println(user); return NONE; } }

    3.使用模型驱动和属性封装注意问题:

           在一个action中,获取表单数据可以属性封装,使用模型驱动封装,

    不能同时使用属性封装和模型驱动封装获取同一个表单数据

           如果同时使用,之后执行模型驱动

     

    4.4  表达式封装(重点)

    1 实现过程

    (1)使用表达式封装可以把表单数据封装到实体类对象里面

    data4.jsp

    第一步 在action里面声明实体类

    第二步 生成实体类变量的set和get方法

    第三步 在表单输入项的name属性值里面写表达式形式

     

    //表达式封装 public class DataDemo4Action extends ActionSupport { //1声明实体类 private User user; //2生成实体类变量的set和get方法 public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { System.out.println(user); return NONE; } }

    4.5  比较表达式封装和模型驱动封装

    1 使用表达式封装和模型驱动封装都可以把数据封装到实体类对象里面

    2 不同点:

    (1)使用模型驱动只能把数据封装到一个实体类对象里面

    - 在一个action里面不能使用模型驱动把数据封装到不同的实体类对象里面

     

    (2)使用表达式封装可以把数据封装到不同的实体类对象里面

    data4.jsp

     

     

    //表达式封装 public classDataDemo5Action extends ActionSupport { //1 声明实体类 private User user; private Book book; public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } //2 生成实体类变量的set和get方法 public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String execute() throws Exception { System.out.println(user); System.out.println(book.getBname()); return NONE; } }

    5      封装到集合里面

    5.1  封装数据到List集合

    第一步 在action声明List

    第二步 生成list变量的set和get方法

    public class ListAction extends ActionSupport { //1 声明List变量 private List<User> list; //2 生成get和set方法 public List<User>getList() { return list; } public voidsetList(List<User> list) { this.list = list; } @Override public String execute() throws Exception { System.out.println(list); return NONE; } } 

    第三步 在表单输入项里面写表达式

     

    5.2  封装数据到Map集合

    第一步 声明map集合

    第二步 生成get和set方法

    public class MapAction extends ActionSupport { //1 声明map集合 private Map<String,User> map; public Map<String, User> getMap() { return map; } public void setMap(Map<String,User> map) { this.map = map; } @Override public String execute() throws Exception { System.out.println(map); return NONE; } } 

    第三步 在表单输入项的name属性值里面写表达式

    <form action="${pageContext.request.contextPath}/list.action" method="post"> <!-- list[0] : 表示list集合中第一个user对象 --> username:<input type="text" name="list[0].username"/> <br/> password:<input type="text" name="list[0].password"/> <br/> address:<input type="text" name="list[0].address"/> <br/><br/> username:<input type="text" name="list[1].username"/> <br/> password:<input type="text" name="list[1].password"/> <br/> address:<input type="text" name="list[1].address"/> <br/> <input type="submit" value="提交"/> </form>  

    6      案例-添加客户功能

    1 模型驱动获取表单数据

    2 在hibernate实现

    3 添加之后到列表页面中,让列表的action执行一次

     

    1 客户列表功能

     

    2 添加客户功能

     

    3 修改客户

     

    4 删除客户

    源代码文件:http://download.csdn.net/detail/qq_26553781/9777359

    转载请注明原文地址: https://ju.6miu.com/read-25085.html

    最新回复(0)