Struts2 Action标签

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值