需求:使用Struts2框架来接收请求并响应客户端,下面我们开始练习:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>struts2</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置struts2的过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
至此Struts2环境搭建完毕
用户模块功能包括用户注册与用户登录两个功能
该工具用于获取数据库连接,并具有对数据库进行增删改查的功能,其本质上是对JDBC的封装。
代码如下:
package com.muke.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 数据库工具类
* @author kenewstar
*
*/
@SuppressWarnings("all")
public class DBConnection {
private static final String DBDRIVER = "com.mysql.jdbc.Driver";
private static final String DBURL = "jdbc:mysql://localhost:3306/test";
private static final String DBUSER = "root";
private static final String DBPWD = "1234";
private static Connection conn = null;
private static PreparedStatement ps = null;
private static ResultSet rs = null;
private static int index = 0;
//获取数据库连接
public static Connection getConn() {
try {
//1.加载驱动
Class.forName(DBDRIVER);
//2.获取数据库连接
conn = DriverManager.getConnection(DBURL,DBUSER,DBPWD);
}catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//执行数据库更新操作
public static int executeUpdate(String sql,Object[] obj) {
try {
//获取连接
conn = getConn();
//预处理
ps = conn.prepareStatement(sql);
//给占位符赋值
for(int i=0;i<obj.length;i++) {
ps.setObject(i+1, obj[i]);
}
//执行sql语句
index = ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
close(conn,ps,null);
}
return index;
}
//执行数据库插入操作
public static int executeInsert(String sql,Object[] obj) {
index = executeUpdate(sql,obj);
return index;
}
//执行数据库删除操作
public static int executeDelete(String sql,Object[] obj) {
index = executeUpdate(sql,obj);
return index;
}
//执行数据库查询操作
public static ResultSet executeQuery(String sql,Object[] obj) {
try {
//获取连接
conn = getConn();
//预处理
ps = conn.prepareStatement(sql);
//给占位符赋值
for(int i=0;i<obj.length;i++) {
ps.setObject(i+1, obj[i]);
}
//执行sql语句
rs = ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
//关闭数据库资源
public static void close(Connection conn,PreparedStatement ps,ResultSet rs) {
try {
if(rs!=null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(ps!=null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if(conn!=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
首先我们创建一个用户实体类,用于临时存储数据,代码如下:
package com.muke.domain;
/**
* 用户实体类
* @author kenewstar
*
*/
public class User {
private int id; //数据库编号
private String username; //用户名---->对应数据库字段名
private String password; //用户密码--->对应数据库字段名
//生成getter与setter方法
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
}
DAO层用于对数据库操作,创建SQL语句,调用步骤①中的DBConnection工具类,代码如下:
package com.muke.dao;
import java.util.List;
import com.muke.domain.User;
/**
* 数据访问层
* 用于对数据库进行操作的接口
* @author kenewstar
*
*/
public interface UserDao {
//用户注册
//返回结果大于 0 则表示用户注册成功
//否则表示用户注册失败
int userRegister(User user);
//用户登录
//首先判断session作用域中是否有用户信息
//若session作用域中没有用户信息,
//则执行此接口操作用于从数据库中查找是否有此用户
//返回用户信息
User userLogin(User user);
}
package com.muke.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.muke.dao.UserDao;
import com.muke.domain.User;
import com.muke.util.DBConnection;
/**
* 数据访问层的实现类
* @author kenewstar
*
*/
public class UserDaoImpl implements UserDao {
//此obj数组用于给sql语句的占位符进行赋值
private Object[] obj = null;
@Override
public int userRegister(User user) {
//创建SQL语句
String sql = "insert into user(username,password) values(?,?)";
//给obj数组添加数据
obj = new Object[] {user.getUsername(),user.getPassword()};
//调用数据库工具类执行数据操作
int i = DBConnection.executeInsert(sql, obj);
//返回值用于验证用户注册是否成功
return i;
}
@Override
public User userLogin(User user) {
//创建SQL语句
String sql = "select * from user where username=? and password=?";
//给obj数组添加数据
obj = new Object[] {user.getUsername(),user.getPassword()};
//调用数据库工具类执行数据查询操作
ResultSet rs = DBConnection.executeQuery(sql, obj);
//创建List用于零时存储用户信息
User u= null;
try {
//取出结果集
if(rs.next()) {
u = new User();
u.setId(rs.getInt(1));
u.setUsername(rs.getString(2));
u.setPassword(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DBConnection.close(null, null, rs);
}
return u;
}
}
由于本练习功能简单,因此不创建业务逻辑层,若读者想创建业务逻辑层,可自行添加。控制器代码如下:
package com.muke.action;
import java.util.Map;
import com.muke.dao.UserDao;
import com.muke.dao.impl.UserDaoImpl;
import com.muke.domain.User;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* 用户Action
* @author kenewstar
*
*/
@SuppressWarnings("all")
public class UserAction extends ActionSupport implements ModelDriven<User>{
//声明Dao层对象,用于调用接口
private UserDao userDaoImpl = new UserDaoImpl();
//实体对象,用于接收前台请求的数据
private User user = new User();
//创建session
Map<String,Object> session = ActionContext.getContext().getSession();
@Override
public User getModel() {
return this.user;
}
//用户注册功能
public String userRegister() {
//使用userDaoImpl调用注册方法
int i = userDaoImpl.userRegister(user);
if(i>0) {
//i>0表示注册成功,跳转至登录页面,并给予用户提示,注册成功!
//注册成功后将用户信息放在session作用域中,以便登录使用
session.put("user", user);
//用户注册成功的提示信息
session.put("msg","注册成功!");
return "login";
}else {
//用户注册失败
session.put("msg", "注册失败!");
//跳转至注册页面
return "register";
}
}
//用户登录功能
public String userLogin() {
//当用户发出登录功能请求时,首先从session域中查询是否有用户信息
User u = (User)session.get("user");
if(u!=null) { //session作用域中存在该用户信息,则直接判断
if(u.getUsername().equals(user.getUsername())&&
u.getPassword().equals(user.getPassword())) {
//用户信息匹配成功则跳转至main.jsp页面,并显示登录用户名
return "main";
}else {
//用户登录失败,给予提示信息,返回登录页面
session.put("msg", "登录失败!");
return "login";
}
}else {
//session作用域中不存在用户的信息,则从数据库中查找
u = userDaoImpl.userLogin(user);
if(u!=null) {
//若u不等于空,则登录成功,并将信息存储在session作用域中,在主页面面显示登录用户名
session.put("user", u);
return "main";
}else {
//用户登录失败,返回至登录页面,提示用户信息
session.put("msg", "登录失败!");
return "login";
}
}
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<!-- 打开动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
<!-- 声明常量,当struts.xml修改后,自动加载 -->
<constant name="struts.configuration.xml.reload" value="true"/>
<!-- 声明包 -->
<package name="myPackage" extends="struts-default" namespace="/">
<global-allowed-methods>regex:.*</global-allowed-methods>
<!--UserAction配置信息-->
<action name="user" class="com.muke.action.UserAction">
<result name="login" type="redirect">login.jsp</result>
<result name="main" type="redirect">main.jsp</result>
<result name="register" type="redirect">register.jsp</result>
</action>
</package>
</struts>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>struts2首页</title>
</head>
<body>
<a href="register.jsp">用户注册</a>
<hr>
<a href="login.jsp">用户登录</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户注册页面</title>
</head>
<body>
<h2>用户注册</h2>
<h4 style="color:red;"><s:property value="#session.msg"/></h4>
<hr>
<s:form action="user" method="post">
<s:textfield name="username" label="用户名"></s:textfield>
<s:password name="password" label="密码"></s:password>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用户登录页面</title>
</head>
<body>
<h2>用户登录</h2>
<h4 style="color:red;"><s:property value="#session.msg"/></h4>
<hr>
<s:form action="user!userLogin" method="post">
<s:textfield name="username" label="用户名"/>
<s:password name="password" label="密码"/>
<s:submit value="登录"/>
</s:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
<h2>欢迎访问</h2>
<hr>
<h4 style="color:red;"><i>欢迎用户 : </i>
<i><s:property value="#session.user.username"/></i></h4>
</body>
</html>
至此所有代码书写完毕,启动项目
输入localhost/struts2(默认端口80,可以不写)得到首页如下: