1. 程式人生 > >Struts2一之典型用例

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等各種格式資料,註解實現

同一類中不同方法不共享返回配置

類級返回配置粒度

返回頁面,需在配置檔案中配置對應關係,配置檔案實現

同一類中的不同方法共享返回配置