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的第一步。千里之行,始於足下嘛。