Struts2一之典型用例
寫一個簡單的登入跳轉的場景來記錄下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等各種格式資料,註解實現 同一類中不同方法不共享返回配置 |
類級返回配置粒度 返回頁面,需在配置檔案中配置對應關係,配置檔案實現 同一類中的不同方法共享返回配置 |