架構實例之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