1. 程式人生 > >Struts2實現簡單的登陸 / 註冊功能

Struts2實現簡單的登陸 / 註冊功能

我 是用idea寫的。

需求分析:

使用者進入首頁,選擇登陸,跳轉到登陸 / 註冊頁面登陸模組,如有賬戶,登陸成功跳轉首頁,並顯示使用者名稱如沒有賬戶,註冊一個賬戶成功後,跳回登陸模組。在這裡沒有實現使用者儲存功能

1、首頁的效果

2、登陸/註冊頁面的效果

登陸成功後

一、準備工作

1、匯入jar包。下面是Struts2的核心jar包

                                               

2、web.xml 和 struts.xml

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    
    <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>/*</url-pattern>
    </filter-mapping>

</web-app>

struts.xml(我放在src目錄下)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
  <!--在這裡設定好每一個Action-->

</struts>

下面開始碼程式碼

二、開始

我準備好了三個頁面                                                           class檔案

                     

建立一個LoginAction.javaRegisterAction.java,還有一個Model類User.java。MapData.java是模擬資料庫,儲存一些使用者資料

Action類都繼承ActionSupport類

LoginAction.java

  • 驗證使用者名稱,密碼
public class LoginAction extends ActionSupport {

    private User user=new User();

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        System.out.println("zhixing");

        if (Info(user)){
            return SUCCESS;
        }else {
            return ERROR;
        }

    }

    public boolean Info(User user){
        boolean flag=false;
        //這裡只寫了一個使用者的驗證方式
        if(user.getUsername().equals("clmmei")&&user.getPassword().equals("123456")){
            flag=true;
        }

        return flag;
    }
}

RegisterAction.java

  • 驗證使用者名稱,密碼是否已經存在
public class RegisterAction extends ActionSupport {

    private User user=new User();
    private String errorMsg="";

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String execute() throws Exception {
        MapData mapData=new MapData();
        mapData.addMapDate(user);
        if (mapData.errorMsg==""&&mapData.errorEmail==""){
            return SUCCESS;
        }else {
            this.errorMsg=mapData.errorMsg+","+mapData.errorEmail;
            return ERROR;
        }

    }
}

注意到 每個Action類都有一個自動執行的execute()方法

 @Override
    public String execute() throws Exception {
        //實現的功能
        //...
        return SUCCESS;
       //return ERROR;
}

完整的struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <!--在這裡設定好每一個Action-->
    <package name="musicLoRe" extends="struts-default">
        <action name="login" class="com.music.action.LoginAction">
            <result name="success">index.jsp</result>
        </action>
        <action name="register" class="com.music.action.RegisterAction">
            <result name="success">login_register.jsp</result>
            <result name="error">error.jsp</result>
        </action>
    </package>
</struts>

<package>標籤是區別每一個包(可隨意區別)

<action>標籤代表每一個Action類,<result>代表execute()方法返回的結果,

例如 :

<action name="login" class="com.music.action.LoginAction">
    <result name="success">index.jsp</result><!--返回SUCCESS,預設轉發到index.jsp頁面-->
</action>

<result name=" "  type="dispatcher(預設) /redirect/redirectAction/...">

1) dispatcher:轉發(預設的,可不寫)

2) redirect :重定向

3)redirectAction :( 請求重定向到指定的Action注意當前路徑和重定向的路徑 )

4)chain :用於把相關的幾個action連線起來,共同完成一個功能(處於chain中的action屬於同一個http請求,共享一個ActionContext )

5) plaintextj :結果型別用於直接在頁面上顯示原始碼

注意:

1)當註冊成功時,將該使用者的使用者名稱顯示在登陸模組上,這個效果我是用js實現的

login_register.js部分程式碼

window.onload=function () {
    var myUser=GetQueryString("User.username");
    if (myUser!=""&&myUser!=null){
        document.getElementById("username").value=myUser
    }
}


function GetQueryString(name)
{
    var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);//從問號 (?) 開始的 URL(查詢部分)
    if(r!=null)return  unescape(r[2]);
    return null;
}

2)登陸成功後,使用者名稱顯示在index.jsp頁面時也用js實現

index.js的部分程式碼

window.onload=function () {
    var myUser=GetQueryString("User.username");
    if (myUser!=""&&myUser!=null){
        var a=document.getElementById("userId");
        a.innerHTML=myUser;
        a.href="#";
    }
}

function GetQueryString(name)
{
    var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if(r!=null)return  unescape(r[2]);return null;
}

登陸模組的部分jsp中的程式碼:

 <form action="login">
                <ul>
                    <li>使用者名稱:<input type="text" name="User.username" id="username" value=""></li>
                    <li>密&nbsp;&nbsp;&nbsp;碼:<input type="text" name="User.password" id="password"></li>
                    <li><button type="submit">登陸</button>&nbsp;&nbsp;&nbsp;&nbsp;<button type="reset">重置</button></li>
                    <li class="lo_re2">還沒有註冊!請先註冊</li>
                </ul>
            </form>

可以注意到,<input>name值是User.username,這是直接給LoginAction.javaUser賦值的方式

同理,

註冊模組的JSP部分程式碼:

<form action="register">
                <ul>
                    <li>用&nbsp;&nbsp;戶&nbsp;&nbsp;名:<input type="text" name="User.username" id="username0"></li>
                    <li>密&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;碼:<input type="text" name="User.password" id="password0"></li>
                    <li>確認密碼:<input type="text" name="password" id="password1"></li>
                    <li>郵&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;箱:<input type="email" name="User.email" id="email"></li>
                    <li>出生年月:</li>
                    <li><button type="submit">登陸</button>&nbsp;&nbsp;&nbsp;&nbsp;<button type="reset">重置</button></li>
                </ul>
            </form>

完整程式碼,請點選 登陸/註冊 

我在GitHub上放了這個專案,提醒一下,我的 idea是 ideaIU-2017.3.4