功能示意图如下:
1.在浏览器输入http://localhost:8000/struts_day02/login/form或http://localhost:8000/struts_day02/login/form.action
显示登录页面
2.输入用户名和密码,点击登录按钮,有两种情况,用户名或密码错误,此时会在当前登录页显示错误信息,若登录成功则跳转到成功页面(两种页面显示如下)
浏览器链接地址为:http://localhost:8000/struts_day02/login/check.action
失败页面:
成功页面:
----------------------------------------------------------------------
项目结构如下:
web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>struts_day02</display-name>
<filter>
<display-name>StrutsPrepareAndExecuteFilter</display-name>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>StrutsPrepareAndExecuteFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
子控制器Action:
package cn.tedu.action;
//登录
public class LoginAction {
//接收两个参数
private String username;
private String password;
//接收参数的bean属性必须与界面空间的name属性一致
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String error;//登陆失败向页面传递参数 ${error}
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
private String message;//登陆成功时传递的参数 ${message}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute(){
if("tom".equalsIgnoreCase(username) && "123".equals(password)){
message = "欢迎Tom再次回来";
return "success";
}
//登录失败
error = "用户名或密码错误!";
return "login";
}
}
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>
<package namespace="/login" name="login" extends="struts-default">
<!-- 这个action标签中没有class属性,在请求/login/form时就不会执行Action而直接转发到jsp -->
<action name="form">
<result>/WEB-INF/login.jsp</result>
</action>
<action name="check" class="cn.tedu.action.LoginAction">
<result name="success">/WEB-INF/success.jsp</result>
<result name="login">/WEB-INF/login.jsp</result>
</action>
</package>
</struts>
注意:此处的第一个action配置的时候没有class属性,result标签也没有name属性,所以不会经过Action子控制器,而是直接转发到指定的jsp文件
login.jsp文件:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<h2>${error}</h2>
<form action="check.action" method="post">
<div>
<label>用户名:</label>
<input type="text" name="username">
</div>
<div>
<label>密码:</label>
<input type="password" name="password">
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
success.jsp文件:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>消息</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>
----------------------------------------------------------------------------------------------------
方法二:利用域模型传递表单参数
web.xml配置文件同上
在浏览器输入http://localhost:8000/struts_day02/login/form2或http://localhost:8000/struts_day02/login/form2.action
登录页面同上,输入用户名和密码页面显示同上,代码如下:
UserInfo类如下:
package cn.tedu.action;
import java.io.Serializable;
/**
* 普通的javabean
* 域模型类:用于封装用户相关信息 可以再
* 可以在登录控制器和注册控制器中重用
*/
public class UserInfo implements Serializable{
private static final long serialVersionUID = -8306901684466363196L;
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;
}
@Override
public String toString() {
return "UserInfo [name=" + name + ", password=" + password + "]";
}
}
子控制器Action:
package cn.tedu.action;
public class LoginAction2 {
//利用UserInfo封装表单信息
private UserInfo user;
public UserInfo getUser() {
return user;
}
public void setUser(UserInfo user) {
this.user = user;
}
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String execute(){
System.out.println(user);
if("tom".equals(user.getName()) && "123".equals(user.getPassword())){
message = "欢迎TOM";
return "success";
}
message = "用户名或密码错误!";
return "error";
}
}
点击登录按钮,浏览器链接地址为:http://localhost:8000/struts_day02/login/check2.action
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>
<package namespace="/login" name="login" extends="struts-default">
<!-- 这个action标签中没有class属性,在请求/login/form时就不会执行Action而直接转发到jsp -->
<!-- 利用域模型登录 -->
<action name="form2">
<result>/WEB-INF/login2.jsp</result>
</action>
<action name="check2" class="cn.tedu.action.LoginAction2">
<result name="success">/WEB-INF/success.jsp</result>
<result name="error">/WEB-INF/login2.jsp</result>
</action>
</package>
</struts>
login2.jsp文件
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<h2>${message}</h2>
<form action="check2.action" method="post">
<div>
<label>用户名:</label>
<input type="text" name="user.name">
</div>
<div>
<label>密码:</label>
<input type="password" name="user.password">
</div>
<div>
<input type="submit" value="登录">
</div>
</form>
</body>
</html>
success.jsp文件:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>消息</title>
</head>
<body>
<h1>${message}</h1>
</body>
</html>