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.

原文地址:https://www.cnblogs.com/boyangx/p/4069133.html