1. 程式人生 > >Struts2實現登陸功能Demo

Struts2實現登陸功能Demo

最近在學習SSH框架,通過用struts實現一個簡單的登陸功能,來學習struts相關知識,著重瞭解了struts的配置。

1、在Eclipse下建立StrutsDemo專案,並將struts2所必須的jar包匯入lib目錄下。

主要有如下7個jar包:commons-fileupload、commons-io、freemarker、javassiat、ognl、struts2-core、xwork。

2、在src目錄下建立一個struts.xml檔案用於配置struts。

struts.xml內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <!-- struts2的action必須放在一個指定的包空間下定義 -->
    <package name="default" namespace="/" extends="struts-default">
        <action name="login" class="com.demo.LoginAction" method="execute">
            <result name="success">/WEB-INF/success.jsp</result>
            <result name="login">/WEB-INF/login.jsp</result>
        </action>
    </package>

</struts>

主要屬性說明:

package-name:用於區別不同的package;必須是唯一的、可用的變數名;用於其它package來繼承;

package--namespace:用於減少重複程式碼(和struts1比較);包的namespace屬性用於定義該包的名稱空間,名稱空間作用為訪問該包下的action路徑的一部分。namespace屬性可以不配置,如果不指定該屬性,預設的名稱空間為””。

package--extends:用於繼承其它package以使用裡面的過濾器等東東;

action--name:用於在一個package裡區別不同的action;必須是唯一的、可用的變數名;是呼叫action時輸入路徑的組成部分;

action--class:action所在的路徑(包名+類名);

action--method:action所呼叫的方法名;

action元素method屬性,預設值為method=”execute”,也就是當action接收到請求後,交給哪個方法去處理,預設的是交給execute方法去處理,當然,也可以交給其他方法。

通常每個包都應該繼承struts-default包,因為struts2很多核心功能都是攔截來實現的。如從請求中把請求引數封閉到action、檔案上傳和資料驗證等都是通過攔截器實現的。

struts-default定義了這些攔截器和Result型別,可以這麼說,當包繼承了struts-default才能使用struts2提供的核心功能,struts-default包是在struts2-core-2.xx.jar檔案中的struts-defalut.xml中定義。struts-default.xml也是struts2預設配置檔案,struts2每次都會自動載入struts-default.xml檔案。

result元素主要定義檢視的跳轉和返回的行為及型別。

常用開關的介紹
<constant name="struts.i18n.encoding" value="UTF-8"/>指定Web應用的預設編碼集,相當於呼叫HttpServletRequest的setCharacterEncoding方法

<constant name="struts.action.extension" value="do"/>該屬性指定需要Struts 2處理的請求字尾,該屬性的預設值是action,即所有匹配*.action的請求都由Struts 2處理。    如果使用者需要指定多個請求字尾,則多個字尾之間以英文逗號(,)隔開。   

<constant name="struts.serve.static.browserCache " value="false"/>設定瀏覽器是否快取靜態內容,預設值為true,開發階段最好false

<constant name="struts.configuration.xml.reload" value="true"/>當struts的配置檔案修改後,系統是否自動重新載入該檔案,預設值為false,開發階段最好true

<constant name="struts.devMode" value="true"/>開發模式下設為true,這樣可以打印出更詳細的錯誤資訊

<constant name="struts.enable.DynamicMethodInvocation" value="false"/>動態方法呼叫,可以解決多個請求對應一個Servlet的問題,後面詳細講解,預設為true,關閉則設為false.

3、在web.xml中加入struts2 MVC框架啟動配置

web.xml內容如下:

<?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">

	<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>/*</url-pattern>
	</filter-mapping>

	<welcome-file-list>
		<welcome-file>/WEB-INF/index.jsp</welcome-file>
	</welcome-file-list>
</web-app>
4、在src目錄下新建LoginAction類。

LoginAction.java程式碼如下:

package com.demo;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1438866827399732426L;
	
	private String username;
	private String password;
	
	@Override
	public String execute(){
		System.out.println("run execute...");
		if("admin".equals(username) && "123456".equals(password)){
			return SUCCESS;
		}
		return LOGIN;
	}
	
	
	public String getUsername(){
		return username;
	}
	
	public void setUsername(String name){
		this.username = name;
	}
	
	public String getPassword(){
		return password;
	}
	
	public void setPassword(String password){
		this.password = password;
	}
}

注:LoginAction類繼承了ActionSupport類,並且在execute方法的返回裡,使用了SUCCESS和LOGIN變數。它們倆對應的值分別為:success、login(小寫)。所以,在struts.xml裡配置的result的name屬性裡,必須寫為小寫。要不然,會報"Could not find action or result"的錯誤。

LoginAction有兩個屬性,Struts會自動把輸入框中的內容通過getter、setter方法設定進來。

提交資料後,struts會自動呼叫execute方法。

返回值代表結果頁面的名稱,具體檔案路徑在配置檔案中配置。

ActionSupport類的作用 :struts2不要求我們自己設計的action類繼承任何的struts基類或struts介面。但是我們為了方便實現我們自己的action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,並重寫此類裡的public String execute() throws Exception方法。因為此類中實現了很多的實用藉口,提供了很多預設方法,這些預設方法包括國際化資訊的方法、預設的處理使用者請求的方法等,這樣可以大大的簡化Acion的開發。 

Struts2中通常直接使用Action來封裝HTTP請求引數,因此,Action類裡還應該包含與請求引數對應的屬性,並且為屬性提供對應的getter和setter方法。

5、建立login.jsp頁面和success.jsp頁面

login.jsp程式碼如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:form action="login" method="post">
    <s:label value="系統登陸"></s:label>
    <s:textfield name="username" label="賬號" />
    <s:password name="password" label="密碼" />
    <s:submit value="登入" />
</s:form>

</body>
</html>
success.jsp程式碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>歡迎<s:property value="username"/>!</h2>
</body>
</html>
6、經過上述步驟,登入例項已經編寫完畢。執行效果如下圖:

登陸介面:在訪問的時候加了action字尾,我這裡不加就訪問不了。照說應該是不加也行的。


登陸成功介面:


7、總結:對struts2進行了入門學習,尤其仔細看了struts配置的相關資料。學習struts是掌握SSH的第一步。千里之行,始於足下嘛。