在本教程中,它将重用以前的Strust 2 Hello World(XML版本)示例,并将其转换为注释版本。
Struts 2注释概念
Struts 2约定插件支持Struts 2注释,因此,您必须了解其“ 扫描方法 ”和“ 命名转换器 ”机制背后的魔力。
1.扫描方法
许多Struts 2文章或书籍都指出,您可以配置过滤器的“ init-param ”或“ struts.convention.action.packages ”来告诉Struts 2在何处扫描带注释的类。 例如,
web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
<init-param>
<param-name>actionPackages</param-name>
<param-value>com.mkyong.common</param-value>
</init-param>
</filter>
根据我的测试(Struts2版本2.1.6和2.1.8),这是不正确的,无论您在“ param-value ”或“ struts.convention.action.packages ”中添加了什么,Struts 2都将忽略它,并且仅扫描名为struts,struts2,一个或多个动作的指定文件夹。
扫描方式如下
- 扫描位于打包的名为“ struts,struts2,action或actions ”的带注释的类。
- 接下来,扫描符合以下任一条件的文件:
- 实现com.opensymphony.xwork2.Action接口。
- 扩展com.opensymphony.xwork2.ActionSupport类。
- 文件名以Action结尾(例如,UserAction,LoginAction)。
请参阅Struts 2常规插件文档 。
2.命名转换器
Struts 2约定插件会将所有带注释的操作文件名转换为指定格式。
例如: LoginAction.java
- 首先,删除文件名末尾的“ Action”一词(如果有)。
- 第二,将文件名的首字母转换为小写。
因此,在删除结尾并转换第一个字母的大小写之后, LoginAction.action将更改为login.action 。
仅当您的Struts 2项目正确遵循命名约定时,Struts 2约定插件的“扫描方法”和“命名转换器”功能才真正带来很多便利和好处。 否则将是一场彻底的灾难。
Struts 2注释示例
现在是时候开始转换过程了。
最终项目结构
1.更新pom.xml
要使用Struts 2注释功能,您需要下载struts2-convention-plugin.jar 。
pom.xml
...
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.1.8</version>
</dependency>
...
2. LoginAction
创建一个LoginAction扩展了ActionSupport ,什么也不做, ActionSupport默认返回一个“成功”字符串,它将匹配@Result并重定向到“ pages / login.jsp ”。
注释版本
package com.mkyong.user.action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import com.opensymphony.xwork2.ActionSupport;
@Namespace("/User")
@ResultPath(value="/")
@Result(name="success",location="pages/login.jsp")
public class LoginAction extends ActionSupport{
}
等价的XML
<package name="user" namespace="/User" extends="struts-default">
<action name="Login">
<result>pages/login.jsp</result>
</action>
</package>
3. WelcomeUserAction
重写execute()方法,并指定@Action和@Result批注。
注释版本
package com.mkyong.user.action;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import com.opensymphony.xwork2.ActionSupport;
@Namespace("/User")
@ResultPath(value="/")
public class WelcomeUserAction extends ActionSupport{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Action(value="Welcome", results={
@Result(name="success",location="pages/welcome_user.jsp")
})
public String execute() {
return SUCCESS;
}
}
等价的XML
<package name="user" namespace="/User" extends="struts-default">
<action name="Welcome" class="com.mkyong.user.action.WelcomeUserAction">
<result name="SUCCESS">pages/welcome_user.jsp</result>
</action>
</package>
在Struts 2个注解- @Action,@Result和@Namespace是不言自明,你可以随时与XML等价进行比较。 @ResultPath可能需要一点解释,请参见此@ResultPath示例 。
4. JSP视图页面
普通的JSP视图页面接受用户名和密码,并在单击“提交”按钮后重定向到欢迎页面。
login.jsp
Struts 2 Hello World Annotation Example
welcome_user.jsp
Struts 2 Hello World Annotation Example
Hello
5. struts.xml
无需创建struts.xml文件,所有类均已注释。
6. web.xml
只需创建一个经典的web.xml文件,然后将FilterDispatcher过滤器声明为正常即可。
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Struts 2 Web Application</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
7.运行
LoginAction.action更改为login.action ,请参见上面的“命名转换器”。
http:// localhost:8080 / Struts2Example / User / login.action
http:// localhost:8080 / Struts2Example / User / Welcome.action
参考
翻译自: https://mkyong.com/struts2/struts-2-hello-world-annotation-example/