以一个简单的登录案例来讲解
创建JavaEE项目,选择Web application,勾选struts2
选择稍后自行添加jar包
导入jar包
注意这里面的struts-core-2.5.20已经整合了xwork-core.jar相关插件,所以在官方下载的zip包的lib目录下找不到xwork-core.jar包
设置web.xml过滤器,为struts2方式
如下:
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
注意这里面的过滤器类的位置,在struts 2.5版本之上就已经修改为上面这样,否则为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
1. 通过以前的Servlet来获取
Index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login.action">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
2. 创建一个action
LoginAction
第一种获取参数方式:通过request对象
package action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpServletRequest;
public class LoginAction extends ActionSupport {
public String login(){
//虎丘请求参数
//第一种方法:通过request对象
HttpServletRequest request = ServletActionContext.getRequest();
String username=request.getParameter("username");
String password=request.getParameter("password");
System.out.println(username);
System.out.println(password);
//NONE 不跳转
return NONE;
}
}
第二种获取方式:通过属性的set注入
LoginAction
package action;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport {
private String username;
private String password;
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public String login(){
//获取请求参数
//第二种方式:通过set注入
System.out.println(username);
System.out.println(password);
//NONE 不跳转
return NONE;
}
}
struts.xml与第一种方法一样
为什么会注入,是因为struts在调用action之前会经过一些拦截器,这其中就包括一个名为 params的拦截器,这个拦截器会判断提供的action中是否存在setter,如果存在,会将对应的params注入到这一变量中。
第三种方式:通过javabean注入(原理:为action添加一个bean的set和get方法)
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login_3.action">
用户名:<input type="text" name="user.username"/><br>
密码:<input type="password" name="user.password">
<input type="submit" value="登录">
</form>
</body>
</html>
注意这里面的name属性值应该写为javabean名.属性名
LoginAction
package action;
import com.opensymphony.xwork2.ActionSupport;
import module.User;
public class LoginAction_3 extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String login(){
System.out.println(user.getUsername()+" "+user.getPassword());
return NONE;
}
}
这里面提供user的set和get方法,在访问该action之前的时候,struts拦截器会自动拦截,将这一参数user注入action里面的user
User(javabean里面提供对应的属性和setter、getter、toString方法)
package module;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
第四种方法:通过模型驱动,在action里面实现一个模型驱动接口,这种方法最常用
原理:在调用action之前会经过拦截器ModuleDriven
通过这种方式,简化了之前的javabean注入
实现步骤:
1. 在action里面实现一个模型驱动接口
2. 提供一个模型属性,并且一定要赋值
LoginAction
package action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import module.User;
public class LoginAction_4 extends ActionSupport implements ModelDriven<User> {
public String login(){
System.out.println(user);
return NONE;
}
private User user=new User();
@Override
public User getModel() {
return user;
}
}
login.jsp不用像之前那样写user.属性名,直接写上属性名就可以了
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>login</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/login_4.action">
用户名:<input type="text" name="username"/><br>
密码:<input type="password" name="password">
<input type="submit" value="登录">
</form>
</body>
</html>
第五种方法:通过静态参数注入(少用)
在action里面将params写死
struts.xml
<package name="p2" extends="struts-default" namespace="/test">
<action name="login_5" class="action.LoginAction_5" method="login">
<param name="username">zjas</param>
<param name="password">zjas</param>
</action>
</package>