Struts Action 笔记
package.Namespace
package.namespace默认为“”,必须以“/”开头,例如“/req”而不能是“req”。如果namespace为“”,那这个package就会成为全局的,凡请求可以匹配到action,都会匹配到这个namespace,例如:
//package 的namespace不写默认为
<package extends="struts-default" name="main">
<action name="req">
<result>/index.jsp</result>
</action>
</package>
请求无论为http://localhost:8080/Struts2/abcdefg/a/b/c/req
还是http://localhost:8080/Struts2/req
都是可以请求到index.jsp的
Action的方法调用(3种方式)
第一种方式是在struts.xml中明确指明该请求应该调用哪个方法:
<package extends="struts-default" name="main">
<action name="req" class="action.action" method="index">
<result>/index.jsp</result>
</action>
</package>
第二种方式是在请求的时候用动态方法调用(DMI)来调用方法,struts.xml可以指明也可以不指明具体调用的方法名,而在请求链接的时候用!连接方法实现调用
<package extends="struts-default" name="main">
<action name="req" class="action.action">
<result>/index.jsp</result>
</action>
</package>
请求可以为:http://localhost:8080/Struts2/req!index
第三种方式:
<package extends="struts-default" name="main">
<action name="req_*" class="action.action" method="{1}">
<result>/{1}.jsp</result>
</action>
</package>
这种方式是通过通配符调用,主要有两个主要地方:*通配符 和 {1}占位符。
通配符可以模糊匹配客户端的请求,而占位符是为 准备调用哪个方法而占位的。
上面的代码为例,如果如果请求为http://localhost:8080/Struts2/req_index
的话,则会调用action.action中的index()或者doIndex()。占位符中数字说明这个为第几个*而占位。
第三种方法以牺牲可读性缩短xml配置文件内容,可以使xml非常精简,例如:
<package extends="struts-default" name="main" namespace="/">
<action name="*_*" class="action.action" method="{1}{2}">
<result>/{1}{2}.jsp</result>
</action>
</package>
当请求http://localhost:8080/Struts2/req_index
的时候就会调用action.action
类下的index()
方法,如果方法返回了success的话,则会在web-Root下找到req_index.jsp页面。这样的话请求的自由度非常的高。凡是xxx_xxx的请求都是适用的。
接收请求参数(3种方式)
在action类中定义成员变量以及成员的setting、getting,在请求传递到Struts的时候,Struts会根据action中的class反射action类并且实例化,这个时候就会将参数通关过setting给变量赋值。
public class action extends ActionSupport{
private int id;
private String name;
public void setId(int id){
this.id = id;
}
public int getId(){
return this.id;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
//...
}
请求为:http://localhost:8080/Struts2/req!index?id=10&name=abc
需要注意的是:Struts反射的是方法而不是成员变量,所以,请求的参数名要与方法名(getting、setting)对应。
第二种方式是在action类中使用对象进行接收参数
public class action extends ActionSupport{
private User user;
public void setUser(User user){
this.user = user;
}
public int getUser(){
return this.user;
}
//...
}
请求为:http://localhost:8080/Struts2/req!index?user.id=10&user.name=abc
第三种方式:
action类实现ModelDriven接口,并实现方法public T getModel()
。
public class action extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return this.user;
}
@Override
public String execute() throws Exception {
System.out.println(this.user.getName());
return super.execute();
}
}
请求为:http://localhost:8080/StrutsDemo/req?user.name=abcdef
这种方式需要实例化好对象。
数据校验
简单的数据校验,查看错误信息,debug标签。
action类继承了ActionSupport类之后,可以使用addFieldError()来为字段添加错误,在页面中用Strtus标签库来查看这个错误。或者使用debug标签查看各个对象的数据信息。
@Override
public String execute() throws Exception {
this.addFieldError("name","错误1");
return ERROR;
}
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
<s:fielderror></s:fielderror>
<s:debug></s:debug>
</body>
action中访问web元素(四种方式)
struts.xml配置
第一种:依赖容器
依赖Struts的ActionContext.getContext()
获取web元素。
public class action extends ActionSupport {
private Map request;
private Map session;
private Map application;
@Override
public String execute(){
Map request = (Map)ActionContext.getContext().get("request");
request.put("r", "rrr");
Map session = (Map)ActionContext.getContext().getSession();
session.put("s", "ssss");
Map application = (Map)ActionContext.getContext().getApplication();
application.put("a", "aaaa");
return SUCCESS;
}
第二种:依赖注入/控制反转
public class action extends ActionSupport implements SessionAware,RequestAware,ApplicationAware{
private Map<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> application;
@Override
public String execute(){
Map request = (Map)ActionContext.getContext().get("request");
request.put("r", "rrr");
Map session = (Map)ActionContext.getContext().getSession();
session.put("s", "ssss");
Map application = (Map)ActionContext.getContext().getApplication();
application.put("a", "aaa");
return SUCCESS;
}
@Override
public void setApplication(Map<String, Object> arg0) {
this.application = arg0;
}
@Override
public void setRequest(Map<String, Object> arg0) {
this.request = arg0;
}
@Override
public void setSession(Map<String, Object> arg0) {
this.session = arg0;
}
}
第三种:依赖容器
public class action extends ActionSupport{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override
public String execute(){
this.request = ServletActionContext.getRequest();
request.setAttribute("r", "rrr");
this.session = this.request.getSession();
this.session.setAttribute("s", "sss");
this.application = ServletActionContext.getServletContext();
this.application.setAttribute("a", "aaa");
return SUCCESS;
}
}
第四种:依赖注入/控制反转
public class action extends ActionSupport implements ServletRequestAware,ServletContextAware{
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
@Override
public String execute() throws Exception {
this.request.setAttribute("r", "rrr");
this.session = this.request.getSession();
this.session.setAttribute("s", "sss");
this.application.setAttribute("a", "aaa");
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
}
包含模块和默认Action
包含模块标签<default-action-ref name="req">index.jsp</default-action-ref>
默认Action标签<include file="struts2.xml"></include>