你的位置:首页 > Java教程

[Java教程]架构实例之SpringTest


架构实例之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.

   (3)在WebRoot/WEB-INF/lib下放入以下三个jar包spring.jar、mysql-connector-java-5.0.8-bin.jar、commons-dbcp.jar,此处即可完成本项目的所有玩家搭建,接下来就是具体代码的书写;

   (4)首先,完成web.

 

<??><web-app version="3.0"   ="http://java.sun.com/   ="http://www.w3.org/2001/   xsi:schemaLocation="http://java.sun.com/> <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.

 

<??><beans  ="http://www.springframework.org/schema/beans"  ="http://www.w3.org/2001/  ="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