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

  • 相关阅读:
    软件定义网络基础---REST API的设计规范
    软件定义网络基础---REST API概述
    软件定义网络基础---北向接口协议概述
    软件定义网络基础---SDN控制平面
    软件定义网络基础---NETCONF协议
    判断是否是完全二叉树
    G: 又见模法师
    欧拉定理+欧拉筛选法
    hdu-2036求任意多边形面积
    hdu1754 区间更新查询(单点更新+查询求区间最大值)
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/5765671.html
Copyright © 2011-2022 走看看