zoukankan      html  css  js  c++  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.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

  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/5765671.html
Copyright © 2011-2022 走看看