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.java和RegisterAction.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>密 碼:<input type="text" name="User.password" id="password"></li>
<li><button type="submit">登陸</button> <button type="reset">重置</button></li>
<li class="lo_re2">還沒有註冊!請先註冊</li>
</ul>
</form>
可以注意到,<input>的name值是User.username,這是直接給LoginAction.java的User賦值的方式
同理,
註冊模組的JSP部分程式碼:
<form action="register">
<ul>
<li>用 戶 名:<input type="text" name="User.username" id="username0"></li>
<li>密 碼:<input type="text" name="User.password" id="password0"></li>
<li>確認密碼:<input type="text" name="password" id="password1"></li>
<li>郵 箱:<input type="email" name="User.email" id="email"></li>
<li>出生年月:</li>
<li><button type="submit">登陸</button> <button type="reset">重置</button></li>
</ul>
</form>
完整程式碼,請點選 登陸/註冊
我在GitHub上放了這個專案,提醒一下,我的 idea是 ideaIU-2017.3.4