Jim Blog I've been trying so hard,but doesn't even matter
博客信息

Struts2注解配置

发布时间:『 2018-03-19 15:09 』  博客类别:JavaWeb  阅读(49) 评论(0)

学校刚开始教Struts2框架,完全照着我以前学过的路线再走一遍就没什么意思了,所以玩一下用Struts2的注解配置取代xml配置。

使用Struts2注解需要导入struts2-convention-plugin-2.x.x.jar包,Maven添加下面这个依赖即可,由于依赖关系将自动导入core包:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-convention-plugin</artifactId>
    <version>2.5.14.1</version>
</dependency>

1.@Action@Results

@Action中的value属性就是action的路径(url),@Action写在类上面时,调用的方法是默认的execute方法,results可以配置多个结果集,@Resultname是返回的结果值,type是跳转类型,location是跳转地址,先看一下代码:

@Action(value="login",results={@Result(name="success",type="redirect",location="/main.jsp"),@Result(name="error",location="/login.jsp")})
public class Struts2Action extends ActionSupport{
     
     @Override
     public String execute() throws Exception {
           return ERROR;
     }
}

我把execute方法的返回值设为error,所以访问:http://localhost:8080/projectname/login  时将转发到login.jsp(没有设置跳转方式则默认为转发),如果不使用默认的execute方法,不需要在类上面写@Action,应该写@Results。并在方法上写@Action,且应当写上value属性,当方法上的注解有指定results时,类上面的注解的@Results被屏蔽:

@Results({@Result(name="success",location="/main.jsp"),@Result(name="error",location="/login.jsp")})
public class Struts2Action extends ActionSupport{
     
 @Action(value="login",results={@Result(name="success",location="/hello.jsp"),@Result(name="error",location="/login.jsp")})
     public String login(){
                return SUCCESS;
     }
     
     @Action(value="login2")
     public String login2(){
           return ERROR;
     }

如果只有value属性则可以省略,直接这样写:

@Action("login2")
public String login2(){
           return ERROR;
     }


2.@Namespace

这个和xml配置没什么两样,不过有个需要注意的问题,先贴一段代码:

@Namespace("/s")
@Results({@Result(name="success",location="/main.jsp"),@Result(name="error",location="/login.jsp")})
public class Struts2Namespace extends ActionSupport{
     
     @Action("login")
     public String login(){
                return SUCCESS;
     }
}

当指定的名字空间时,若是action路径不加斜杠,正确的访问路径为:http://localhost:8080/projectname/s/login 

若是有加斜杠:

@Action("/login")
     public String login(){
                return SUCCESS;
     }

则访问路径:http://localhost:8080/projectname/s/login  http://localhost:8080/projectname/login 都是正确的


3.动态方法调用

动态方法调用需要在struts.xml文件里面开启动态方法调用(上面两个配置例子是完全不需要struts.xml文件就可运行的):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
     <!-- 开启动态方法调用,即在页面用action!method -->
     <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
</struts>

新建一个Class,取名为一个单词或一个单词加后缀Action,例如:StudentStudentAction,代码如下:

@AllowedMethods("login")
@Results({@Result(name="success",location="/main.jsp"),@Result(name="error",location="/login.jsp")})
public class StudentAction extends ActionSupport{
 
     public String login(){
                return SUCCESS;
     }
}

即可通过地址:http://localhost:8080/projectname/student!login 访问,至于为什么可以这样,为什么只有满足上述的取名条件才能寻找到action,我也不知道,麻烦知道的大神也告诉我一下。。。

ps:要求写@AllowedMethods应该是2.5版本后新加的


关键字:   struts2     注解  
博主信息
Jim
(生命,是一场徒劳的坚持)