架構實例之SpringTest
1、開發工具和開發環境
開發工具: MyEclipse10,JDK1.6.0_13(32位),Tomcat7.0(32位),mysql5.7.13
開發環境:WIN7
2、SpringTest實現功能
用戶登錄、用戶注冊、退出登錄。
3、SpringTest使用技術
本實例使用了JSP、Spring3.1框架、JdbcTemplate來實現用戶登錄、用戶注冊和退出登錄功能。系統架構圖如圖一所示:
圖一:SpringTest系統架構圖
4、具體實現
(1)在MyEclipse中新建一個Web項目,並命名為SpringTest。項目建立完成後,鼠標選擇該項目並點擊右鍵選擇MyEclipse選項,再選擇Add Spring Capabilities選項,再選擇Spring3.1Core Libraries,最後點擊finish按鈕即可初步完成Spring框架環境搭建;
(2)在src中會自動生成一個appllicaitonContext.xml文件,此處把該文件放到WebRoot/WEB-INF目錄下,並把該文件重新命名為spring-servlet.xml;
(3)在WebRoot/WEB-INF/lib下放入以下三個jar包spring.jar、mysql-connector-java-5.0.8-bin.jar、commons-dbcp.jar,此處即可完成本項目的所有玩家搭建,接下來就是具體代碼的書寫;
(4)首先,完成web.xml中的相關配置,具體代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app
(5)接下來,就是spring-servlet.xml中的相關配置,具體代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- 配置數據源與事務 -->
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/demo_test</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>root</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<!-- 定義DAO -->
<bean id="userDAO" class="com.liu.spring.dao.UserDAO">
<property name="dataSource">
<ref local="dataSource" />
</property>
</bean>
<bean id="UserDAOProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="target">
<ref local="userDAO" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 定義視圖 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>
org.springframework.web.servlet.view.InternalResourceView
</value>
</property>
<!-- JSP都放在/目錄下 -->
<property name="prefix">
<value>/</value>
</property>
<!-- JSP頁面的後綴都四.JSP -->
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- 定義映射 -->
<bean id="loginMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login.do">loginAction</prop>
</props>
</property>
</bean>
<bean id="logoutMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/logout.do">logoutAction</prop>
</props>
</property>
</bean>
<bean id="registerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/register.do">registerAction</prop>
</props>
</property>
</bean>
<!---定義Action-->
<bean id="loginAction"
class="com.liu.spring.actions.LoginAction">
<property name="commandClass">
<value>com.liu.spring.forms.LoginForm</value>
</property>
<!-- 指定DAO類 -->
<property name="userDAO">
<ref local="userDAO" />
</property>
<!-- 指定失敗要返回的頁面 -->
<property name="formView">
<value>login</value>
</property>
<!-- 指定成功要返回的頁面 -->
<property name="successView">
<value>welcome</value>
</property>
</bean>
<bean id="logoutAction"
class="com.liu.spring.actions.LogoutAction">
<property name="commandClass">
<value>com.liu.spring.forms.LoginForm</value>
</property>
<property name="successView">
<value>login</value>
</property>
</bean>
<bean id="registerAction"
class="com.liu.spring.actions.RegisterAction">
<property name="commandClass">
<value>com.liu.spring.forms.RegisterForm</value>
</property>
<!-- 指定DAO類 -->
<property name="userDAO">
<ref local="userDAO" />
</property>
<!-- 指定失敗要返回的頁面 -->
<property name="formView">
<value>register</value>
</property>
<property name="successView">
<value>login</value>
</property>
</bean>
</beans>
(6)用戶登錄、注冊表單類具體代碼:
用戶登錄表單類代碼如下:
package com.liu.spring.forms;
public class LoginForm {
private String username;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
用戶注冊表單類代碼如下:
package com.liu.spring.forms;
public class RegisterForm {
private String username;
private String password1;
private String password2;
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword1() {
return password1;
}
public void setPassword1(String password1) {
this.password1 = password1;
}
public String getPassword2() {
return password2;
}
public void setPassword2(String password2) {
this.password2 = password2;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
(7)用戶登錄、注冊、退出Action類具體代碼:
用戶登錄Action類代碼
package com.liu.spring.actions;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import com.liu.spring.dao.UserDAO;
import com.liu.spring.forms.LoginForm;
import com.liu.spring.util.Constants;
public class LoginAction extends SimpleFormController {
UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
LoginForm loginForm = (LoginForm) command;
if (isValid(loginForm)) {
request.getSession().setAttribute(Constants.USERNAME_KEY, loginForm.getUsername());
return new ModelAndView(getSuccessView());
} else {
@SuppressWarnings("unchecked")
Map<String, Object> modle = errors.getModel();
modle.put("loginForm", loginForm);
return new ModelAndView(getFormView(), modle);
}
}
public boolean isValid(LoginForm loginForm) {
// if (loginForm.getUsername().equals("admin")
// && loginForm.getPassword().equals("admin")) {
// return true;
// } else {
// return false;
// }
if(userDAO.isValid(loginForm.getUsername(), loginForm.getPassword())) {
return true;
} else {
return false;
}
}
}
其中,用戶登錄中使用了一個USERNAME_KEY字段,此處單獨建立一個Constants類來實現,具體代碼如下:
package com.liu.spring.util;
public class Constants {
public final static String USERNAME_KEY = "username";
}
用戶注冊Action類代碼
package com.liu.spring.actions;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import com.liu.spring.dao.User;
import com.liu.spring.dao.UserDAO;
import com.liu.spring.forms.RegisterForm;
public class RegisterAction extends SimpleFormController {
UserDAO userDAO;
public UserDAO getUserDAO() {
return userDAO;
}
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
String method = request.getParameter("method");
if (method == null || method.equals("init")) {
return init(command, errors);
} else if (method.equals("register")) {
return register(request, response, command, errors);
} else {
RegisterForm registerForm = (RegisterForm) command;
@SuppressWarnings("unchecked")
Map<String, Object> modle = errors.getModel();
modle.put(getFormSessionAttributeName(), registerForm);
return new ModelAndView(getSuccessView(), modle);
}
}
public ModelAndView init(Object command, BindException errors)
throws Exception {
RegisterForm registerForm = (RegisterForm) command;
@SuppressWarnings("unchecked")
Map<String, Object> modle = errors.getModel();
modle.put(getFormSessionAttributeName(), registerForm);
return new ModelAndView(getFormView(), modle);
}
public ModelAndView register(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
RegisterForm registerForm = (RegisterForm) command;
if (!isExist(registerForm)) {
add(registerForm);
@SuppressWarnings("unchecked")
Map<String, Object> modle = errors.getModel();
modle.put(getSuccessView(), registerForm);
response.sendRedirect("login.do");
return null;
//return new ModelAndView(getSuccessView(), modle);
} else {
@SuppressWarnings("unchecked")
Map<String, Object> modle = errors.getModel();
modle.put(getFormSessionAttributeName(), registerForm);
return new ModelAndView(getFormView(), modle);
}
}
public boolean isExist(RegisterForm registerForm) {
// if (registerForm.getUsername().equals("admin")) {
// return true;
// } else {
// return false;
// }
if (userDAO.isExist(registerForm.getUsername())) {
return true;
} else {
return false;
}
}
public void add(RegisterForm registerForm) {
User user = new User();
user.setUsername(registerForm.getUsername());
user.setPassword(registerForm.getPassword1());
user.setEmail(registerForm.getEmail());
userDAO.insertUser(user);
}
}
用戶退出Action類代碼
package com.liu.spring.actions;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
public class LogoutAction extends SimpleFormController {
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
request.getSession().invalidate();
response.sendRedirect("login.do");
return null;
//return new ModelAndView(getSuccessView());
}
}
(8)用戶登錄和注冊進行數據庫驗證類代碼
使用JDBCTemplate完成POJO類User類的創建,具體代碼如下:
package com.liu.spring.dao;
public class User {
protected String id;
protected String username;
protected String password;
protected String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
使用JDBCTemplate完成數據操作類UserDAO類的創建,具體代碼如下:
package com.liu.spring.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
public class UserDAO {
private DataSource dataSource;
public DataSource getDataSource() {
return dataSource;
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public boolean isValid(String username, String password) {
@SuppressWarnings("rawtypes")
List userList = new ArrayList();
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
userList = jdbcTemplate.query("SELECT * FROM userInfo WHERE username='"
+ username + "' and password='" + password + "'",
new RowMapper() {
public Object mapRow(ResultSet rs, int rowNum)
throws SQLException {
User user = new User();
user.setId(rs.getString("ID"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
return user;
}
});
if (userList.size() > 0) {
return true;
} else {
return false;
}
}
public boolean isExist(String username) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
int count = jdbcTemplate.queryForInt("SELECT count(*) FROM userInfo WHERE username='" + username
+ "'");
if (count > 0) {
return true;
} else {
return false;
}
}
public void insertUser(User user) {
String username = user.getUsername();
String password = user.getPassword();
String email = user.getEmail();
JdbcTemplate jt = new JdbcTemplate(getDataSource());
jt.update("insert into userInfo(username,password,email) values ('"
+ username + "','" + password + "','" + email + "');");
}
}
(9)視圖層用戶登錄,用戶注冊和登錄成功後JSP界面代碼
用戶登錄JSP頁面代碼(login.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form name="form1" action="login.do" method="post">
<table width="200" border="1">
<tr>
<td colspan="2">登錄窗口</td>
</tr>
<tr>
<td>用戶名</td>
<td><input type="text" name="username" size="10"></td>
</tr>
<tr>
<td>密碼</td>
<td><input type="password" name="password" size="10"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" value="登錄"> <a
href="register.do?method=init">注冊新用戶</a></td>
</tr>
</table>
</form>
</body>
</html>
用戶注冊JSP頁面代碼(register.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'register.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form name="form1" action="register.do?method=register" method="post">
<table width="200" border="1">
<tr>
<td colspan="2">注冊窗口</td>
</tr>
<tr>
<td>用戶名</td>
<td><input type="text" name="username" size="10"></td>
</tr>
<tr>
<td>密碼</td>
<td><input type="password" name="password1" size="10"></td>
</tr>
<tr>
<td>確認密碼</td>
<td><input type="password" name="password2" size="10"></td>
</tr>
<tr>
<td>Email</td>
<td><input type="text" name="email" size="10"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" value="登錄"> <a
href="login.do">返回</a></td>
</tr>
</table>
</form>
</body>
</html>
登錄成功後JSP頁面代碼(welcome.jsp)
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'welcome.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form name="form1" action="logout.do" method="post">
<table width="200" border="1">
<tr>
<td colspan="2">登錄成功</td>
</tr>
<tr>
<td>歡迎你,</td>
<td><%=(String) session.getAttribute("username")%></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" value="退出"></td>
</tr>
</table>
</form>
</body>
</html>
5、運行結果
開啟Tomcat服務後,打開浏覽器輸入:http://localhost:8080/SpringTest/login.jsp,將會出現下圖二所示結果:
圖二:用戶登錄界面
點擊注冊新用戶,將會出現以下圖三所示結果(點擊登陸,如果注冊成功就會返回到登陸界面,如果未成功則保留在注冊界面):
圖三:用戶注冊界面
用上圖中注冊的賬號進行登陸,登陸成功後出現下圖四所示結果:

圖四:用戶登陸成功後界面
PS:本項目具體源碼GitHub鏈接:https://github.com/miaomiaoqiushui/SpringTest