写一个简单的登录跳转的场景来记录下struts2的用法。
前端使用的是DMI请求方式,后台action使用继承ActionSupport的方式创建action
一.构建struts2环境
1.导入struts2的jar包
2.配置struts2的核心配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="abc" extends="struts-default">
<action name="userlogin" class="com.softeem.actions.LoginAction">
<result name="success">/index.jsp</result>
<result name="fail">/fail.jsp</result>
</action>
</package>
</struts>
3.在web.xml中启用struts2配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
</web-app>
二.构建业务场景
demo中有三个页面:login.jsp ,index.jsp,fail.jsp
一个action业务类:LoginAction
1.业务流程:
1).用户在login.jsp登录页面输入用户名和密码。
2).调用LoginAction的check方法验证,验证成功跳转到index.jsp页面,验证失败跳转fail.jsp页面。
2.各文件配置
login页面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'login.jsp' starting page</title>
</head>
<body>
<font color="red" size="+3" face="微软雅黑">登录页面</font>
<form action="userlogin!check.action" method="post">
账号:<input type="text" name="user.userName"><br>
密码:<input type="text" name="user.userPass"><br>
<input type="button" value="注册" onclick="javascript:window.location.href='regist.jsp'" />
<input type="submit" value="登录">
</form>
</body>
</html>
成功页面:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
</head>
<body>
${user.userName}<br>
</body>
</html>
失败页面:
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
login fail!
</body>
</html>
action业务处理类:
package com.softeem.actions;
import com.opensymphony.xwork2.ActionSupport;
import com.softeem.pojos.User;
public class LoginAction extends ActionSupport{
private User user;
@Override
public String execute() throws Exception {
return "success";
}
public String check(){
System.out.println("userName:"+user.getUserName()+"|userPass:"+user.getUserPass());
if(user.getUserName().equals("admin")&&user.getUserPass().equals("123456")){
return "success";
}else{
return "fail";
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
action中用到了一个数据封装对象User:
package com.softeem.pojos;
import java.io.Serializable;
public class User implements Serializable{
private int userId;
private String userName;
private String userPass;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPass() {
return userPass;
}
public void setUserPass(String userPass) {
this.userPass = userPass;
}
}
测试:
打开页面login.jsp:
输入账号/密码:admin/123456,登录成功页面:
输入其他账号/密码:admin/1234,登录失败跳转页面:
上面的代码中有几个点需要注意:
1)url到业务处理方法的映射。首先LoginAction需要在配置文件中配置,相当于注册。在login.jsp中通url:userlogin!check.action这个地址映射到LoginAction的check方法中。这是struts2种的DMI映射方式。
2)参数的传递与接收。参数使用的User业务数据对象进行封装,struts2中接收请求的方法都是无参的方法,参数不能直接通过方法中定义的参数传递给业务处理方法,必须通过类中的定义的成员属性来接收前端传递过来的参数。
3)处理后的页面跳转。struts2中的接收请求的方法的返回值都是String类型的,其处理完毕后的页面跳转也要在struts2的核心配置文件中配置,通过不同的result返回码来映射到不同的返回结果页面,这也导致了一个问题是一个类中的所有方法都共用返回页面配置。
三.struts2与SpringMVC的简单比较
从使用MVC框架的经验来看,我认为一个MVC框架主要具备的核心功能点有:
1)url到业务处理方法的映射实现。
2)前后端数据传递过程中的数据自动封装。
3)处理完毕后的页面跳转实现。
其他的数据类型的转换,数据校验等都属于辅助性的功能。
通过以上3个点来对struts2和springMVC做一个简单的对比。
对比项目 | SpringMVC | Struts2 |
URL映射配置 | 注解实现,在请求处理类中加入注解 | 配置文件实现,在struts2配置文件中对请求处理类配置 |
参数传递实现(粒度) |
方法级粒度 业务方法参数直接接收
同一类中不同方法不共享前端参数 | 类级粒度 需要在请求处理类中定义成员属性类来接受参数 同一类中的各个方法共享前端参数 |
处理结果页面跳转(粒度) | 方法级返回配置粒度 可以返回页面,json等各种格式数据,注解实现 同一类中不同方法不共享返回配置 | 类级返回配置粒度 返回页面,需在配置文件中配置对应关系,配置文件实现 同一类中的不同方法共享返回配置 |