学校刚开始教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可以配置多个结果集,@Result的name是返回的结果值,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
,例如:
Student
或
StudentAction
,代码如下:
@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
版本后新加的
文章来自我的个人博客:http://jimblog.site/blog/articles/81.html