Struts2框架,是一个开源的Java EE Web应用程序框架,已经成为众多企业应用开发人员的首选之一。它采用了MVC架构模式,并且在框架内集成了一些流行的Java技术,如Spring和Hibernate,使得开发更加轻松和高效。本文将探讨Struts2框架的关键技巧和最佳实践,以帮助你更好地掌握这个经典的Web应用程序框架。
一、核心概念理解
Struts2框架的核心概念是Action和Interceptor。Action是应用程序的控制器,负责接收HTTP请求、处理业务逻辑和向客户端响应结果。Interceptor是在Action执行过程中介入的,用于实现类似日志记录、权限检查、数据验证等功能的切面。这两个概念是Struts2框架的核心,也是学习和使用Struts2框架的基础。因此,我们需要深入理解它们的实现原理和使用方法。
二、Action的实现方法
Action是Struts2框架的控制器,它处理HTTP请求,并根据请求的信息调用相应的业务逻辑处理程序。Struts2框架中有两种Action的实现方法:基于类的Action和基于注解的Action。
1. 基于类的Action
基于类的Action是指Action类继承自Struts2框架中的ActionSupport类,并覆盖其中的方法来处理请求。ActionSupport类提供了许多有用的方法和接口,如获取Request、Response、Session、ServletContext等对象的方法,同时也实现了常用的结果类型。以下是一个基于类的Action的范例:
```java
public class LoginAction extends ActionSupport {
//表单参数
private String username;
private String password;
//Getter和Setter方法
//...
//处理请求的方法
public String execute() throws Exception {
//业务逻辑处理
if(username.equals("admin") && password.equals("123456")) {
return SUCCESS;
} else {
addActionError("用户名或密码错误!");
return ERROR;
}
}
}
```
在这个例子中,LoginAction类继承自ActionSupport类,在execute()方法中处理了请求,并根据业务处理结果返回相应的结果类型,SUCCESS表示成功,ERROR表示失败。如果用户名或密码错误,就通过addActionError()方法向页面添加错误信息。使用ActionSupport类并覆盖其中的方法,可以让开发人员更加快速、方便地开发一个Action。
2.基于注解的Action
基于注解的Action是在Action类中定义注解来映射Action的URL,不再需要继承ActionSupport类。以下是一个基于注解的Action的范例:
```java
@Namespace("")
@Action(value = "login", results = {
@Result(name = "success", location = "/success.jsp"),
@Result(name = "error", location = "/error.jsp")
})
public class LoginAction {
//表单参数
private String username;
private String password;
//Getter和Setter方法
//...
//处理请求的方法
public String execute() {
//业务逻辑处理
if(username.equals("admin") && password.equals("123456")) {
return SUCCESS;
} else {
addActionError("用户名或密码错误!");
return ERROR;
}
}
}
```
在这个例子中,通过@Namespace注解指定了命名空间(默认为空),@Action注解则指定了Action对应的URL和结果类型等信息。通过注解来配置的方式,使Action的编写更加简单明了。
三、Interceptor的使用方法
Interceptor是Struts2框架中非常重要的一个概念,它允许在Action执行的过程中运行自定义代码。在Struts2框架中,有许多内置的Interceptor用于实现常用的功能,例如日志记录、数据验证、权限检查等。
1. 内置的Interceptor
Struts2框架内置了许多Interceptor,可以通过在struts.xml文件中配置来使用它们。以下是一些内置Interceptor的例子:
- LoggingInterceptor:用于记录日志信息。
- ValidationInterceptor:用于数据验证。
- ExceptionMappingInterceptor:用于处理异常,并将异常信息传递到指定的结果页面。
- SecurityInterceptor:用于权限检查。
2. 自定义的Interceptor
如果Struts2框架内置的Interceptor不能满足开发需求,也可以自定义Interceptor。自定义Interceptor需要先实现Interceptor接口,并重写其中的方法。以下是一个自定义的Interceptor的简单范例:
```java
public class MyInterceptor implements Interceptor {
public void init() {
//初始化操作
}
public String intercept(ActionInvocation invocation) throws Exception {
//在Action执行之前运行代码
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//运行Action
String result = invocation.invoke();
//在Action执行之后运行代码
System.out.println("Action执行结束!");
return result;
}
public void destroy() {
//销毁操作
}
}
```
在这个例子中,MyInterceptor类实现了Interceptor接口,并覆盖了其中的init()、intercept()和destroy()方法。在intercept()方法中,通过调用ActionInvocation类的invoke()方法来执行Action,并在Action执行之前和之后运行自定义代码。
四、结果页面的配置方式
结果页面是Action执行后将要显示的页面,Struts2框架中有多种方式可以用来配置结果页面。以下是一些常用的结果页面配置方式:
1.直接跳转
在Action的处理逻辑中,直接使用response对象的sendRedirect()方法来跳转到指定页面。如:
```
public String execute(){
HttpServletResponse response=ServletActionContext.getResponse();
response.sendRedirect("success.jsp");
return null;
}
```
2.配置全局的结果类型
在struts.xml文件的
```xml
/
.jsp
```
在这个例子中,配置了一个名为jsp的结果类型和一个全局的success结果,结果类型为jsp,并指定了结果页面的路径和后缀名。
3.在Action中单独配置结果类型
在Action中声明的结果类型将覆盖在全局范围内声明的结果类型。如:
```java
public class LoginAction extends ActionSupport {
public String execute() {
//业务处理
return "success";
}
@Override
public void validate() {
//数据校验
//如果出错跳转到 ‘error’ 界面
addActionError("用户名或者密码不能为空!");
addFieldError("username", "用户名不能为空!");
addFieldError("password", "密码不能为空!");
this.setActionErrors(getActionErrors());
this.setFieldErrors(getFieldErrors());
this.setErrorCode("5001");
this.addActionError("用户名或密码错误,请重新输入!");
}
}
```
在这个例子中,自定义了validate()方法,并在方法中添加了一些校验代码,如果出错则返回“error”页面。
总结
Struts2框架作为一种成熟的Java Web应用程序框架,拥有丰富的功能和强大的扩展性。,可以帮助我们更加高效、方便地完成Web应用程序的开发。在学习和使用Struts2框架的过程中,需要理解核心概念、掌握Action和Interceptor的使用方法、熟悉结果页面的配置方式等。只有不断的学习和实践,才能使我们变得更加优秀。