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.