zoukankan      html  css  js  c++  java
  • Struts2_Action

    【1】提示:preference->catalog
    【2】执行过程:客户端——HTTP-->服务端WEB APPLICATION—查找对应的配置文件XML—>遇到Filter--->他会过滤所有的URL--->并它请求提交给struts.xml--->struts.xml会     先查看namespace,发现/--->然后继续查看action--->发现了hello的action--->最后提交result.
    【3】设计模式的好处是:可扩展性 【Struts2就是将请求和视图分开】
    【4】package用于区分重名
    【5】Struts1的action在访问类时都是同一个对象【1的这种设置会导致线程同步的问题】
         而Struts2是每次访问action时,都会访问action后面的class,都会New一个对象,对象又会调用自己的方法,再根据结果success去找对应的jsp文件并返回。且result的默     认name就是success,所以省略后就是
         <action name="index">
         <result>/Namespace.jsp</result>

         Action只是一个控制器,并不能对客户端产生任何响应,只能将指定的视图资源返回给用户.通过配置其子节点<result>来定义逻辑视图和物理视图的关系.
         <action name="add" class="com.action.myAction">
           <result name="input" type="redirect">/input.jsp</result>
           </action>
    【Struts2中的Action,并不需要依赖于特定的Web容器。我们看不到类似HttpServletRequest,HttpServletResponse等Web容器相关的对象】
    【6】Action执行的时候并不一定要执行execute方法
         可以在配置文件中配置Action的时候用method=来指定执行哪个方法
         也可以在url地址中动态指定(动态方法调用DMI)(推荐)
         前者会产生太多的action,所以不推荐使用
    <package name="user" extends="struts-default" namespace="/user">
            <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
                <result>/user_add_success.jsp</result>
            </action>
           
            <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
                <result>/user_add_success.jsp</result>
            </action>
        </package>
    【7】wildcard通配符
        使用通配符,将配置量降到最低
        不过,一定要遵守"约定优于配置"的原则
    <package name="actions" extends="struts-default" namespace="/actions">
            <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
                <result>/Student{1}_success.jsp</result>
            </action>
           
            <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
                <result>/{1}_{2}_success.jsp</result>
                <!-- {0}_success.jsp -->
            </action>
        </package>
    【8】action接收参数,利用action的属性,即使get set方法(pojo):
    public class UserAction extends ActionSupport {
     private String name;
     private int age;
     public String add(){
      System.out.println("name=" + name);
      System.out.println("age=" + age);
      return SUCCESS;
     }
     public String getName(){
      return name;
     }
     public void setName(String name){
      this.name = name;
     }
     public int getAge(){
      return age;
     }
     public void setAge(int age){
      this.age = age;
     } 
    }
    http://localhost:8080//Struts2_0700_ActionAttrParamInput/user/user!add?name=aaa&age=22

    【9】DomainModel
    package com.bjsxt.struts2.user.action;
    import com.bjsxt.struts2.user.model.User;
    public class UserAction extends ActionSupport { 
     private User user;
     //private UserDTO userDTO;
     public String add() {
      System.out.println("name=" + user.getName());
      System.out.println("age=" + user.getAge());
      return SUCCESS;
     }

     public User getUser() {
      return user;
     }

     public void setUser(User user) {
      this.user = user;
     } 
    }
    package com.bjsxt.struts2.user.model;
    public class User {
     private String name;
     private int age;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public int getAge() {
      return age;
     }
     public void setAge(int age) {
      this.age = age;
     }
    }
    当输入的参数多余域模型的参数时(即输入参数和DomainModel的参数不匹配时),我们可以使用DTO(Data Transfer Object)或者VO(Value Object)或者DO(Data Object).

    【10】ModelDriven 模型驱动的设计思想
    package com.bjsxt.struts2.user.action;
    import com.bjsxt.struts2.user.model.User;
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    public class UserAction extends ActionSupport implements ModelDriven<User>{ //使用泛型<user>,避免了使用类型转换
     
     private User user = new User();//这时需要自己去new一个对象,接口不会帮你去自动生成
     
     public String add() {
      System.out.println("name=" + user.getName());
      System.out.println("age=" + user.getAge());
      return SUCCESS;
     }

     @Override //jdk1.6可以 1.5不可以
     public User getModel() {
      return user;
     }
     
    }
    package com.bjsxt.struts2.user.model;
    public class User {
     private String name;
     private int age;
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public int getAge() {
      return age;
     }
     public void setAge(int age) {
      this.age = age;
     }
    }
    action就是controller,它来控制请求的处理,到底调用哪个jsp文件,及其内部的相应处理过程都是由它来做的。
    action的接收参数有三种方法:第一种是action的属性接收,第二种是Domainmodel(也可能是DTO),第三种是ModelDriven。常用的是第二种。

    【11】SimpleDataValiation
    <%@taglib uri="/struts-tags" prefix="s" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=GB18030" />
    <title>Insert title here</title>
    </head>
    <body>
     User Add Error!
     <s:fielderror fieldName="name" theme="simple"/>
     <br />
     <s:property value="errors.name[0]"/>//数组的第一项
     <s:debug></s:debug>
    </body>
    </html>
    action调用了addFieldError的方法,addFieldError结果就在值栈里把这个error的massage返回了。
    errordebug里是个值栈,值栈的value是一个map,map的key和error的key一样,map的值则是一个数组,你可以取其中的任何一个值。也可以自己添加任何的错误表达。<s:property value="errors.name[0]"/> //数组的第一项

    通用资源标识符(Uniform Resource Identifier, 简称"URI")

    【12】向action里传递参数:request session  application【servlet中的ServletContext在JSP里对应的就是applicatiuon】在执行过程中,struts会把我们的map值一一赋到HttpServletRequest,HttpSession,ServletContext中去。
    取得Map类型request,session,application,真实类型 HttpServletRequest, HttpSession, ServletContext的引用:
    1.前三者:依赖于容器

    package com.bjsxt.struts2.user.action;

    import java.util.Map;

    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    public class LoginAction1 extends ActionSupport {
     
     private Map request;
     private Map session;
     private Map application;
     
     public LoginAction1() {
      request = (Map)ActionContext.getContext().get("request");
      session = ActionContext.getContext().getSession();
      application = ActionContext.getContext().getApplication();
     }
     
     public String execute() {
      request.put("r1", "r1");
      session.put("s1", "s1");
      application.put("a1", "a1");
      return SUCCESS;
     }
     
    }


    2.IoC:Inverse of Control   DI:Dependency Injection:依赖别人注入才可以使用(我们的成员变量Request依赖容器Struts2(外界环境)注入,而不是自己去拿)
    Struts2作为一个filter开始的,部署在Container中的filer可以拿到HttpRuqest对象,然后它把HttpRuqest对象中的内容拿出来放到了map中(做了一个映射)。也取了一个名字叫Ruqest.就是说Struts2帮你初始化了Request。Spring里就是它帮你在配置文件里初始化,需要什么就在配置文件里写。

    package com.bjsxt.struts2.user.action;

    import java.util.Map;

    import org.apache.struts2.interceptor.ApplicationAware;//获得Application类
    import org.apache.struts2.interceptor.RequestAware;
    import org.apache.struts2.interceptor.SessionAware;

    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    public class LoginAction2 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 void setRequest(Map<String, Object> request) {
      this.request = request;
     }

     @Override
     public void setSession(Map<String, Object> session) {
      this.session = session;
     }

     @Override
     public void setApplication(Map<String, Object> application) {
      this.application = application;
     } 
    }


    (只用这种)
    3.当你想用到一些不常用的方法时,类似于除Request之外的等等:

    package com.bjsxt.struts2.user.action;

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionSupport;

    public class LoginAction3 extends ActionSupport {
     
     private HttpServletRequest request;
     private HttpSession session;
     private ServletContext application;
     
     public LoginAction3() {
      request = ServletActionContext.getRequest();
      session = request.getSession();
      application = session.getServletContext();
     }
     
     public String execute() {
      request.setAttribute("r1", "r1");
      session.setAttribute("s1", "s1");
      application.setAttribute("a1", "a1");
      return SUCCESS;
     } 
    }

    4.ServletRequestAware

    package com.bjsxt.struts2.user.action;

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;

    import org.apache.struts2.interceptor.ServletRequestAware;

    import com.opensymphony.xwork2.ActionSupport;

    public class LoginAction4 extends ActionSupport implements ServletRequestAware {
     
     private HttpServletRequest request;
     private HttpSession session;
     private ServletContext application;
     
     public String execute() {
      request.setAttribute("r1", "r1");
      session.setAttribute("s1", "s1");
      application.setAttribute("a1", "a1");
      return SUCCESS;
     }

     @Override
     public void setServletRequest(HttpServletRequest request) {
      this.request = request;
      this.session = request.getSession();
      this.application = session.getServletContext();
     }
    }

    【13】IncludeModules
    <struts>
        <constant name="struts.devMode" value="true" />
        <include file="login.xml" />
    </struts>
    意义:不同的模块的开发不在一起,所以就各自写各自的模块。

    【14】DefaultAction
    <struts>
        <constant name="struts.devMode" value="true" />    
        <package name="default" namespace="/" extends="struts-default">
         <default-action-ref name="index"></default-action-ref>
         <action name="index">
          <result>/default.jsp</result>
         </action>
        </package>
    </struts>
    默认action:当访问的网页不存在,就会跳转到默认的action.

  • 相关阅读:
    Intellij Idea非常6的10个姿势!
    java 集合
    oracle sql调优
    springboot
    整理的java jdk1.8跟mybatiseplus
    java8中lambda的用法(map转list,list转map等等
    遍历数组中的元素(含es6方法)
    云计算初探
    转FMS小工具用法
    Flex内存消耗
  • 原文地址:https://www.cnblogs.com/boyangx/p/4069133.html
Copyright © 2011-2022 走看看