第一節(jié) 需求定義

簡單的需求如下圖

1 用戶處在Welcome.jsp 頁面,點(diǎn)擊登錄連接到達(dá)Login.jsp頁面

2 Login.jsp輸入用戶名密碼,點(diǎn)擊登陸按鈕,轉(zhuǎn)到LoginAction處理

3.1 在登陸成功的情況下,再回到Welcome.jsp頁面,在頁面上顯示登錄信息

3.2 在登陸失敗的情況下,返回到Login.jsp顯示登陸錯(cuò)誤信息

Welcome.jsp

Login.jsp

1 開始登陸

2 登陸

3.1登陸成功

3.2登陸失敗

LoginAction

 

第二節(jié) 使用maven建立基本開發(fā)結(jié)構(gòu)

使用如下命令建立Struts2 應(yīng)用程序框架結(jié)構(gòu)

mvn archetype:create  

-DgroupId=com.jpleasure

-DartifactId=login 

-DarchetypeGroupId=org.apache.struts  -DarchetypeArtifactId=struts2-archetype-starter

-DarchetypeVersion=2.0.5-SNAPSHOT -DremoteRepositories=http://people.apache.org/repo/m2-snapshot-repository

目錄說明

生成的Struts2開發(fā)框架目錄滿足一般的maven項(xiàng)目,主要由以下目錄組成:

src

   ├─main                              源代碼目錄

     ├─java                             java代碼

     ├─resources                        資源文件等

     └─webapp                           Web目錄

         ├─jsp                              JSP目錄

         ├─styles                           CSS目錄

         └─WEB-INF                          WEB-INF目錄

   └─test                              測(cè)試代碼目錄

        ├─java                              java代碼

        └─resources                         資源文件等

重要文件:

src\main\resources

    applicationContext.xml              Spring配置文件

    log4j.properties                    log4j配置文件

    struts.properties                   struts參數(shù)文件

    struts.xml                          struts配置文件

    xwork-conversion.properties         xwork參數(shù)文件

 

src\main\webapp\WEB-INF

decorators.xml 

dwr.xml                            DWR配置文件

sitemesh.xml                       SiteMesh配置文件

web.xml                            Web部署描述文件

 

進(jìn)入工程目錄(login目錄)使用如下命令建立Eclipse工程文件

mvn eclipse:eclipse

 

使用如下命令打包工程

mvn package

應(yīng)用程序打包完成之后可以再login\target目錄中看到login.war文件,這個(gè)文件就是最終的成果文件

 

使用如下命令運(yùn)行應(yīng)用程序

mvn jetty:run

 

也可以將login.war拷貝到tomcatwebapps目錄下來運(yùn)行struts2應(yīng)用程序。

 

打開IE在瀏覽器中輸入:

http://localhost:8080/login

可以看到如下畫面

說明自動(dòng)生成的框架已經(jīng)可以運(yùn)行。

 

第三節(jié) 補(bǔ)充Login功能

下面我們來完成login功能

首先將login工程導(dǎo)入到Eclipse

 

之后建立在src\main\java目錄中建立LoginAction類,代碼清單如下:

package com.jpleasure.login.action;

 

import javax.servlet.http.HttpSession;

 

import com.opensymphony.xwork2.ActionSupport;

import org.apache.struts2.ServletActionContext;

 

public class LoginAction extends ActionSupport {

    private String name;

    private String password;

    public String getName() {

       return name;

    }

    public void setName(String name) {

       this.name = name;

    }

    public String getPassword() {

       return password;

    }

    public void setPassword(String password) {

       this.password = password;

    }

   

    public String forward() throws Exception {

       return SUCCESS;

    }

   

    @Override

    public String execute() throws Exception {

       if("admin".equals(name)) {

HttpSession session = ServletActionContext.getRequest().getSession();

           session.setAttribute("name", name);

           return SUCCESS;

       } else {

           return INPUT;

       }

    }

}

Action具有以下特點(diǎn):

1 ActionSupport繼承而來。

2 包含一些屬性和gettersetter方法,這些屬性用來保存客戶端傳遞到服務(wù)器的數(shù)據(jù),或者用來作為在JSP上顯示的數(shù)據(jù)的源。

3 有一些返回String類型,無參數(shù)的方法,在LoginAction中是execute方法forwardLogin方法,這些方法就是Action需要執(zhí)行的方法。

 

SUCCESSINPUT都在com.opensymphony.xwork2.Action類中定義,類型為String,分別用來表示成功和輸入結(jié)果。

 

src\main\webapp中建立Welcome.jspLogin.jsp兩個(gè)JSP文件

Welcome.jsp代碼清單如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@taglib prefix="s" uri="/struts-tags" %>

 

<!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>Welcome</title>

</head>

<body>

 

<s:url action="forwardLogin" id="forwardLoginUrl"></s:url>

<s:a href="%{forwardLoginUrl}">Forward Login</s:a>

<%

    if(session.getAttribute("name") != null){

       out.println("<br/> login success.");

    }

%>

</body>

</html>

 

Login.jsp 代碼清單如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@taglib prefix="s" uri="/struts-tags" %>

 

<!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>Login</title>

</head>

<body>

<s:url action="login" id="loginUrl"></s:url>

<s:form action="%{loginUrl}">

    <s:textfield label="Name" name="name"/>

    <s:password label="Password" name="password" />

    <s:submit></s:submit>

</s:form>

</body>

</html>

這些JSP有如下特點(diǎn):

1 有一個(gè)特殊的taglib聲明,<%@taglib prefix="s" uri="/struts-tags" %>這是struts2的標(biāo)準(zhǔn)taglib聲明。

2 一些s標(biāo)簽

<s:url action="forwardLogin" id="forwardLoginUrl"></s:url>定義了一個(gè)叫做forwardLoginUrl的指向forwardLoginAction的路徑。

同理:<s:url action="login" id="loginUrl"></s:url>定義了一個(gè)叫做loginUrl指向loginactionAction的路徑。

<s:a href="%{forwardLoginUrl}">Forward Login</s:a>定義了一個(gè)指向forwardLogin的鏈接,其中href使用了上面定義的內(nèi)容。

<s:form action="%{loginUrl}">

    <s:textfield label="Name" name="name"/>

    <s:password label="Password" name="password" />

    <s:submit></s:submit>

</s:form>

定義了一個(gè)向login Action提交的form,這個(gè)Form提交namepassword兩個(gè)字段,這個(gè)Formaction指向使用了前面定義的loginUrl變量。

 

配置src\main\resources\struts.xml 文件

在默認(rèn)的package中添加如下內(nèi)容

<package name="myPackage" extends="struts-default">

<!-- login begin -->

<action name="forwardLogin" method="forward"

          class="com.jpleasure.login.action.LoginAction">

<result>/Login.jsp</result>

</action>

<action name="login" class="com.jpleasure.login.action.LoginAction">

<result name="input">/Login.jsp</result>

<result>/Welcome.jsp</result>

</action>

<!-- login end -->

</package>

 

每一個(gè)action表示一種向服務(wù)器的請(qǐng)求,name屬性定了了action的名字,classaction對(duì)應(yīng)的服務(wù)器端執(zhí)行的Action類的名字,method是類中的被執(zhí)行的方法的名字。

Result表示默認(rèn)的結(jié)果(SUCCESS的結(jié)果),result可以添加name屬性來表示對(duì)應(yīng)的返回結(jié)果,例如:input

 

 

為了讓應(yīng)用程序開始的時(shí)候能夠顯示Welcome.jsp我們必須修改src\main\webapp\WEB-INF\web.xml,將其中的的welcome-file改為:

 

<welcome-file-list>

        <welcome-file>Welcome.jsp</welcome-file>

</welcome-file-list>

 

第三節(jié) 詳細(xì)描述Login的功能

當(dāng)我們使用IE訪問login程序的時(shí)候,其實(shí)我們是向服務(wù)器發(fā)送了一個(gè)如下的請(qǐng)求:

http://localhost:8080/login

 

當(dāng)應(yīng)用服務(wù)器收到請(qǐng)求的時(shí)候,根據(jù)/login可以判斷你所訪問的應(yīng)用程序是login,之后根據(jù)web.xml中定義的welcome-file找到默認(rèn)的歡迎畫面:Welcome.jsp

 

Welcome.jsp表示的過程中建立了一個(gè)如下的鏈接:

<a href="/login/forwardLogin.action">Forward Login</a>

 

我們點(diǎn)擊這個(gè)鏈接的時(shí)候向服務(wù)器提交了一個(gè)如下的請(qǐng)求:

http://localhost:8080/login/forwardLogin.action 的請(qǐng)求

 

Struts2框架根據(jù)/forwardLogin.action找到對(duì)應(yīng)的Action配置描述(Struts2框架會(huì)自動(dòng)去掉.action后綴,之后進(jìn)行匹配查找操作):

<action name="forwardLogin" method="forward"

          class="com.jpleasure.login.action.LoginAction">

<result>/Login.jsp</result>

</action>

使用LoginAction類的forward方法處理,當(dāng)forward方法返回SUCCESS的時(shí)候,返回給客戶端Login.jsp頁面。

 

Login.jsp表示的過程中建立了一個(gè)如下的Form

<form id="login" onsubmit="return true;" action="/login/login/login.action" method="POST">

<table class="wwFormTable">

<tr>

    <td class="tdLabel"><label for="login_name" class="label">Name:</label></td>

    <td><input type="text" name="name" value="" id="login_name"/></td>

</tr>

<tr>

    <td class="tdLabel"><label for="login_password" class="label">Password:</label></td>

<td><input type="password" name="password" id="login_password"/></td>

</tr>

<tr>

<td colspan="2">

<div align="right"><input type="submit" id="login_0" value="Submit"/></div>

</td>

</tr>

</table>

</form>

當(dāng)點(diǎn)擊Submit按鈕提交Form的時(shí)候,namepassword輸入分別被提交,這個(gè)Form提交的路徑是:/login/login/login.action

 

根據(jù)如下Action配置:

<action name="login" class="com.jpleasure.login.action.LoginAction">

<result name="input">/Login.jsp</result>

<result>/Welcome.jsp</result>

</action>

 

Struts2框架找到對(duì)應(yīng)的LoginAction,同時(shí)將提交上來的namepassword賦值給LoginAction實(shí)例,因?yàn)闆]有說明login調(diào)用的方法,所以Struts框架調(diào)用默認(rèn)的方法:execute



ExtJS教程- Hibernate教程-Struts2 教程-Lucene教程