zoukankan      html  css  js  c++  java
  • springmvc与前端数据交互实例

     

    一、从页面接收参数

    Spring MVC接收请求提交的参数值的几种方法:

    • 使用HttpServletRequest获取。
       @RequestMapping("/login.do")  
      public String login(HttpServletRequest request){  
          String name = request.getParameter("name")  
          String pass = request.getParameter("pass")  
      } 

      

      

    • 使用@RequestParam注解。
      复制代码
          @RequestMapping("/login.do")  
          public String login(HttpServletRequest request,  
                                          String name,  
           @RequestParam("pass")String password) // 表单属性是pass,用变量password接收  
          {  
             syso(name);  
             syso(password)  
          }  
      复制代码
    • 使用自动机制封装成实体参数。

         

    复制代码
        <form action="login.do">  
        用户名:<input name="name"/>  
        密码:<input name="pass"/>  
        <input type="submit" value="登陆">  
        </form>  
          
        //封装的User类  
        public class User{  
          private String name;  
          private String pass;  
        }  
    复制代码
        @RequestMapping("/login.do")  
        public String login(User user)  
        {  
           syso(user.getName());  
           syso(user.getPass());  
        }  

     二、向页面传值

    当Controller组件处理后,需要向响应JSP传值时,可以使用的方法:

    1),使用HttpServletRequest 和 Session  然后setAttribute(),就和Servlet中一样

    Model数据会利用HttpServletRequest的Attribute传值到success.jsp中

    复制代码
        @RequestMapping("/login.do")  
        public ModelAndView  login(String name,String pass){  
            User user = userService.login(name,pwd);  
            Map<String,Object> data = new HashMap<String,Object>();  
            data.put("user",user);  
            return new ModelAndView("success",data);  
        }  
    复制代码

    2),使用ModelAndView对象

    3),使用ModelMap对象

    使用ModelMap参数对象示例:

    ModelMap数据会利用HttpServletRequest的Attribute传值到success.jsp中

    复制代码
        @RequestMapping("/login.do")  
        public String login(String name,String pass ,ModelMap model){  
            User user  = userService.login(name,pwd);  
            model.addAttribute("user",user);  
            model.put("name",name);  
            return "success";  
        }  
    复制代码

    4),使用@ModelAttribute注解

    使用@ModelAttribute示例

    在Controller方法的参数部分或Bean属性方法上使用

    @ModelAttribute数据会利用HttpServletRequest的Attribute传值到success.jsp中

    复制代码
        @RequestMapping("/login.do")  
        public String login(@ModelAttribute("user") User user){  
            //TODO  
           return "success";  
        }  
          
        @ModelAttribute("name")  
        public String getName(){  
            return name;  
        }  
    复制代码

    5)Session存储:可以利用HttpServletReequest的getSession()方法

    复制代码
        @RequestMapping("/login.do")  
        public String login(String name,String pwd  
                                    ModelMap model,HttpServletRequest request){  
             User user = serService.login(name,pwd);  
             HttpSession session = request.getSession();  
             session.setAttribute("user",user);  
             model.addAttribute("user",user);  
             return "success";  
        }  
    复制代码

    6)自定义Map

    复制代码
    @ResponseBody
        @RequestMapping(value = "/updatestatus", method = RequestMethod.POST)
        public Map<String, Object> updateStatus(HttpServletRequest request) {
            Map<String, Object> result = new HashMap<String, Object>();
            String id = request.getParameter("id");
            SystemAdministrator sysadmin=systemAdminBiz.get(Integer.valueOf(id));
            sysadmin.setStatus(1);
            boolean    flag = systemAdminBiz.update(sysadmin);
            result.put("status", flag);
            return result;
        }
    复制代码
    复制代码
    @RequestMapping(value = "/list", method = {RequestMethod.POST,RequestMethod.GET})
        public String queryAdministrator(HttpServletRequest request,ModelMap model) {
            Integer roleId = request.getParameter("roleListById") == null ? 0 : Integer.parseInt(request.getParameter("roleListById"));
            Map<String, Object> properties = new HashMap<String, Object>();
            if(roleId.intValue() > 0) {
                properties.put("role:=", roleId);
                model.put("roleId", roleId);
            }
            List<SystemAdministrator> administrator = systemAdminBiz.find(properties);
            List<SystemRole> systemRole = systemRoleBiz.getAll();
            model.put("administratorList", administrator);
            model.put("roleList", systemRole);
            return "sys_admin_list";
        }
    复制代码

     7)Spring MVC 默认采用的是转发来定位视图,如果要使用重定向,可以如下操作

    1,使用RedirectView

    2,使用redirect:前缀

        public ModelAndView login(){  
           RedirectView view = new RedirectView("regirst.do");  
           return new ModelAndView(view);  
        }  

     或者用如下方法,工作中常用的方法: 

     public String login(){  
        //TODO  
        return "redirect:regirst.do";  
    } 

    三、实例讲解:

    步骤一:创建新Web项目,导入Spring MVC包和业务层UserService

    1. 创建Web项目导入相关的jar包:

     

    2. 导入前述业务层UserService类以及依赖的类,等。

    User类代码如下:

    复制代码
    package com.souvc.entity;
    
    import java.io.Serializable;
    
    public class User implements Serializable {
        private static final long serialVersionUID = -603439325380668432L;
        private int id;
        private String name;
        private String pwd;
        private String phone;
    
        public User() {
        }
    
        public User(int id, String name, String pwd, String phone) {
            this.id = id;
            this.name = name;
            this.pwd = pwd;
            this.phone = phone;
        }
    
        public User(String name, String pwd, String phone) {
            super();
            this.name = name;
            this.pwd = pwd;
            this.phone = phone;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        @Override
        public int hashCode() {
            return id;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (obj instanceof User) {
                User o = (User) obj;
                return this.id == o.id;
            }
            return true;
        }
    
        @Override
        public String toString() {
            return id + "," + name + "," + pwd + "," + phone;
        }
    }
    复制代码

    UserDao接口代码如下:

    复制代码
    package com.souvc.dao;
    
    import com.souvc.entity.User;
    
    /**
     * 用户数据访问对象接口
     */
    public interface UserDao {
        /** 根据唯一用户名查询系统用户, 如果没有找到用户信息返回null */
        public User findByName(String name);
        // public User add(String name, String pwd, String phone);
        // public User find(int id);
        // public User delete(int id);
        // public void update(User user);
    }
    复制代码

    UserService类代码如下:

    复制代码
    package com.souvc.service;
    
    import java.io.Serializable;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import com.souvc.dao.UserDao;
    import com.souvc.entity.User;
    
    /** 业务层 注解 */
    @Service
    // 默认的Bean ID是 userService
    public class UserService implements Serializable {
        private static final long serialVersionUID = 7360372166489952236L;
        private UserDao userDao;
    
        // @Resource //自动匹配userDao对象并注入
        @Resource(name = "userDao")
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;//
        }
    
        public UserDao getUserDao() {
            return userDao;
        }
    
        /** 登录系统功能 */
        public User login(String name, String pwd) throws NameOrPwdException,
                NullParamException {
            if (name == null || name.equals("") || pwd == null || pwd.equals("")) {
                throw new NullParamException("登录参数不能为空!");
            }
            User user = userDao.findByName(name);
            if (user != null && pwd.equals(user.getPwd())) {
                return user;
            }
            throw new NameOrPwdException("用户名或者密码错误");
        }
    }
    复制代码

    NameOrPwdException类代码如下:

    复制代码
    package com.souvc.service;
    
    /** 用户名或者密码错误 */
    public class NameOrPwdException extends Exception {
        public NameOrPwdException() {
        }
    
        public NameOrPwdException(String message) {
            super(message);
        }
    
        public NameOrPwdException(Throwable cause) {
            super(cause);
        }
    
        public NameOrPwdException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    复制代码

    NullParamException类代码如下:

    复制代码
    package com.souvc.service;
    
    /** 参数为空 */
    public class NullParamException extends Exception {
        public NullParamException() {
        }
    
        public NullParamException(String message) {
            super(message);
        }
    
        public NullParamException(Throwable cause) {
            super(cause);
        }
    
        public NullParamException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    复制代码

    JdbcDataSource类代码如下:

    复制代码
    package com.souvc.dao;
    
    import java.io.Serializable;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    /** 组件注解 */
    @Component
    public class JdbcDataSource implements Serializable {
    
        private static final long serialVersionUID = -8925981939329398101L;
    
        private String driver;
    
        @Value("#{jdbcProps.url}")
        private String url;
    
        @Value("#{jdbcProps.user}")
        private String user;
    
        @Value("#{jdbcProps.pwd}")
        private String pwd;
    
        public String getDriver() {
            return driver;
        }
    
        /** 必须使用Bean属性输入, 否则不能进行JDBC Driver注册 */
        @Value("#{jdbcProps.driver}")
        public void setDriver(String driver) {
            try {
                // 注册数据库驱动
                Class.forName(driver);
                this.driver = driver;
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    
        public String getUrl() {
            return url;
        }
    
        public void setUrl(String url) {
            this.url = url;
        }
    
        public String getUser() {
            return user;
        }
    
        public void setUser(String user) {
            this.user = user;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public Connection getConnection() throws SQLException {
            Connection conn = DriverManager.getConnection(url, user, pwd);
            return conn;
        }
    
        public void close(Connection conn) {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    复制代码

    MysqlUserDao类代码如下:

    复制代码
    package com.souvc.dao;
    
    import java.io.Serializable;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Repository;
    
    import com.souvc.entity.User;
    
    /** 持久层 注解 */
    @Repository("userDao")
    // 指定特定的Bean ID 方便setUserDao注入
    public class MysqlUserDao implements UserDao, Serializable {
        private static final long serialVersionUID = 7385842613248394287L;
        private JdbcDataSource dataSource;
    
        public MysqlUserDao() {
        }
    
        /** 创建 MysqlUserDAO 对象必须依赖于JDBCDataSource实例 */
        public MysqlUserDao(JdbcDataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        @Autowired
        // 按照类型自动装配
        public void setDataSource(@Qualifier("jdbcDataSource")
        JdbcDataSource dataSource) {
            this.dataSource = dataSource;
        }
    
        public JdbcDataSource getDataSource() {
            return dataSource;
        }
    
        /** 根据唯一用户名查询系统用户, 如果没有找到用户信息返回null */
        public User findByName(String name) {
            System.out.println("利用JDBC技术查找User信息");
            String sql = "select id, name, pwd, phone  from users where name=?";
            Connection conn = null;
            try {
                conn = dataSource.getConnection();
                PreparedStatement ps = conn.prepareStatement(sql);
                ps.setString(1, name);
                ResultSet rs = ps.executeQuery();
                User user = null;
                while (rs.next()) {
                    user = new User();
                    user.setId(rs.getInt("id"));
                    user.setName(rs.getString("name"));
                    user.setPwd(rs.getString("pwd"));
                    user.setPhone(rs.getString("phone"));
                }
                rs.close();
                ps.close();
                return user;
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                dataSource.close(conn);
            }
        }
    }
    复制代码

    db.properties文件内容如下:

    # config for Mysql
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/souvc
    user=root
    pwd=123456

    spring-mvc.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:context="http://www.springframework.org/schema/context"
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa"
        xmlns:util="http://www.springframework.org/schema/util"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
                http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
                http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
                http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
                http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
                http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
    
        <util:properties id="jdbcProps" location="classpath:db.properties" />
    
        <context:component-scan base-package="com.souvc" />
        <!-- 视图处理 -->
        <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"></property>
            <property name="suffix" value=".jsp"></property>
        </bean>
    </beans>
    复制代码

    Mysql数据库初始化SQL代码如下:

    复制代码
    DROP TABLE users;
    CREATE TABLE USERS 
    (
          ID DOUBLE(7, 0) , 
          NAME VARCHAR(50) , 
          PWD VARCHAR(50), 
          PHONE VARCHAR(50) ,
          PRIMARY KEY (id)
     );
    
    INSERT INTO Users (id, NAME, pwd, phone) VALUES (1, 'Tom', '123', '110');
    INSERT INTO Users (id, NAME, pwd, phone) VALUES (2, 'Jerry', 'abc', '119');
    INSERT INTO Users (id, NAME, pwd, phone) VALUES (3, 'Andy', '456', '112');
    复制代码

    3. 为项目添加JUnit4 API,然后添加测试类TestCase和测试方法testUserService()用于测试上述配置是否正确。TestCase类代码如下:

    复制代码
    package com.souvc.test;
    
    import java.util.Properties;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.souvc.dao.JdbcDataSource;
    import com.souvc.entity.User;
    import com.souvc.service.UserService;
    
    public class TestCase {
    
        @Test
        public void testUserService() throws Exception {
            String cfg = "spring-mvc.xml";
            ApplicationContext ac = new ClassPathXmlApplicationContext(cfg);
            Properties obj = ac.getBean("jdbcProps", Properties.class);
            JdbcDataSource ds = ac.getBean("jdbcDataSource", JdbcDataSource.class);
            System.out.println(obj);
            System.out.println(ds);
            System.out.println(ds.getConnection());
            UserService service = ac.getBean("userService", UserService.class);
            User user = service.login("Tom", "123");
            System.out.println(user);
        }
    }
    复制代码

    执行测试方法testUserService(),在控制台输出的结果:

    {user=root, url=jdbc:mysql://localhost:3306/souvc, driver=com.mysql.jdbc.Driver, pwd=123456}
    com.souvc.dao.JdbcDataSource@1cb1a4e2
    com.mysql.jdbc.JDBC4Connection@3d04fc23
    利用JDBC技术查找User信息
    1,Tom,123,110

    这个结果说明业务层UserService工作正常。

    4. 配置Spring MVC 核心控制器DispatcherServlet到web.xml。web.xml配置部分代码参考如下:

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 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_2_5.xsd">
        <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>
    
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>
                org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:spring-mvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springmvc</servlet-name>
            <url-pattern>*.form</url-pattern>
        </servlet-mapping>
    
    </web-app>
    复制代码

    5. 部署项目到Tomcat并且启动,测试Spring MVC配置是否正常。

    在输出结果中出现内容, 并且没有异常就会说明Spring MVC部署正常。

     

    步骤二:实现login-action1.form登录流程,测试利用HttpServletRequrst传值方法

    1. 在WEB-INF/jsp文件夹下添加login-form.jsp文件,代码如下所示:

    复制代码
    <%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
    <!DOCTYPE HTML>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <c:url var="base" value="/"></c:url>
    <html>
          <head>
            <title>Login Form</title>
            <link rel="stylesheet" type="text/css" href="${base}styles.css">
          </head>
            <body>
                <h6>${message}</h6>
                <form method="post" action="${base}login/login-action1.form">
                    <div>
                        <h2>登录 login-action1.form</h2>
                        <p><label>用户</label><input type="text" name="name"></p>
                        <p><label>密码</label><input type="password" name="pwd"></p>
                        <h3><input type="submit" value="登录"></h3>
                    </div>
                </form>
                
                <form method="post" action="${base}login/login-action2.form">
                    <div>
                        <h2>登录 login-action2.form</h2>
                        <p><label>用户</label><input type="text" name="name"></p>
                        <p><label>密码</label><input type="password" name="pwd"></p>
                        <h3><input type="submit" value="登录"></h3>
                    </div>
                </form>
                
                <form method="post" action="${base}login/login-action3.form">
                    <div>
                        <h2>登录 login-action3.form</h2>
                        <p><label>用户</label><input type="text" name="name"></p>
                        <p><label>密码</label><input type="password" name="pwd"></p>
                        <h3><input type="submit" value="登录"></h3>
                    </div>
                </form>
                
                <form method="post" action="${base}login/login-action4.form">
                    <div>
                        <h2>登录 login-action4.form</h2>
                        <p><label>用户</label><input type="text" name="name"></p>
                        <p><label>密码</label><input type="password" name="pwd"></p>
                        <h3><input type="submit" value="登录"></h3>
                    </div>
                </form>
                
                <form method="post" action="${base}login/login-action5.form">
                    <div>
                        <h2>登录 login-action5.form</h2>
                        <p><label>用户</label><input type="text" name="name"></p>
                        <p><label>密码</label><input type="password" name="pwd"></p>
                        <h3><input type="submit" value="登录"></h3>
                    </div>
                </form>
                
                <form method="post" action="${base}login/login-action6.form">
                    <div>
                        <h2>登录 login-action6.form</h2>
                        <p><label>用户</label><input type="text" name="name"></p>
                        <p><label>密码</label><input type="password" name="pwd"></p>
                        <h3><input type="submit" value="登录"></h3>
                    </div>
                </form>
                
            </body>
        </html>
    复制代码

    方法一解释:

        利用HttpServletRequest对象进行浏览器页面到控制器传值。

    方法二解释:

        使用@RequestParam注解声明表单密码输入框pwd的值注入到password变量,表单中用户名输入框根据名字映自动射注入name变量。 @RequestMapping注解将login-action2.form映射到了checkLogin2()方法。这样就与login- form.jsp表单对应。

    方法三解释:

        这里采用user作为参数, Spring会自动的将页面表单参数name,pwd注入到user对象的相应属性name,pwd传递到方法中。@RequestMapping将请求login-action3.form映射到方法checkLogin3()。

    方法四解释:

        在处理方法完成后返回一个ModelAndView对象。

    方法五解释:

         ModelMap属性值与页面login-form.jsp之间的数据对应。

    方法六解释:

         @ModelAttribute声明的属性与login-form.jsp页面的值关系。

         用户名或者密码错误时候出现的时候,能够记住用户名。

      

    在前述案例中,用户登录成功以后, 可以利用HttpServletRequest对象的getSession()方法访问Session对象, 这样就可以保持用户登录状态了。 

    2. 为页面添加样式文件styles.css,样式文件保存在WebRoot文件夹下,styles.css文件代码如下所示:

    复制代码
    * {
        margin: 0;
        padding: 0;
    }
    
    h6 {
        text-align: center;
        color: red;
        padding: 10px;
        font-size: 14px;
    }
    
    form {
        padding: 10px;
        float: left;
    }
    
    form div {
        border: 1px gray solid;
         320px;
        padding: 8px;
    }
    
    form p input {
         180px
    }
    
    form h2 input {
        text-align: center;
    }
    
    form h2 {
        background: black;
        color: white;
        padding: 4px;
    }
    
    form p {
        background: #ddd;
        padding: 4px 8px 0 8px;
    }
    
    form h3 {
        background: #ddd;
        padding: 8px;
    }
    复制代码

    3. 在WEB-INF/jsp文件夹下添加success.jsp文件,这个文件是登录成功以后显示的界面,代码如下所示:

    复制代码
    <%@ page pageEncoding="utf-8" contentType="text/html; charset=utf-8"%>
    <!DOCTYPE HTML>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <c:url var="base" value="/"></c:url>
    <html>
        <head>
            <title>Success</title>
            <link rel="stylesheet" type="text/css" href="${base}styles.css">
        </head>
        <body>
            <h6>
                ${user.name}登录成功!
            </h6>
        </body>
    </html>
    复制代码

    上述页面中,使用EL表达式和标准标签库配合显示界面数据, 其中<c:url var="base" value="/"></c:url>和${base}用于解决绝对路径问题。

    4. 创建控制器类LoginController,在该类中使用注解@Controller的方式进行配置:

    1)使用@Controller将LoginController声明为控制器Bean组件。

    2)使用@RequestMapping("/login")声明对LoginController组件的请求在/login 路径下。

    3)流程控制方法loginForm(),用于显示登录表单页面。使用@RequestMapping注解将映射请求/login-form.form到loginForm()方法。

    4)增加userService属性,并且使用@Resource注解声明在运行期间注入userService对象。

    5)增加控制流程方法checkLogin1(),使用@RequestMapping注解将请求/login-action1.form映 射到checkLogin1()方法。checkLogin1()方法调用userService的login方法,实现登录流程。 checkLogin1()方法主要是测试JSP页面到控制器的数据传输方式。

    LoginController类代码如下所示:

    复制代码
    package com.souvc.controller;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.ModelMap;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    import com.souvc.entity.User;
    import com.souvc.service.NameOrPwdException;
    import com.souvc.service.NullParamException;
    import com.souvc.service.UserService;
    
    @Controller
    //@SessionAttributes("user")
    @RequestMapping("/login")
    public class LoginController {
    
        @Resource
        // 请求Spring注入资源 userService
        private UserService userService;
    
        @RequestMapping("/login.form")
        public String loginForm() {
            // 可以向表单界面传递一些参数
            return "login-form";
        }
    
        @RequestMapping("/login-action1.form")
        // Spring MVC 自动参数注入HttpServletRequest
        public String checkLogin1(HttpServletRequest req) {
            System.out.println("---方法一---");
            // 优点直接简洁,缺点需要自己处理数据类型转换, 不支持文件上传功能
            String name = req.getParameter("name");
            String pwd = req.getParameter("pwd");
            System.out.println(name);
            System.out.println(pwd);
            try {
                User user = userService.login(name, pwd);
                // 登录成功将登录用户信息保存到当前会话中
                req.getSession().setAttribute("user", user);
                return "success";
            } catch (NameOrPwdException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "login-form";
            } catch (NullParamException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "redirect:login.form";
            } catch (RuntimeException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "error";
            }
        }
    
        @RequestMapping("/login-action2.form")
        public String checkLogin2(String name, @RequestParam("pwd")
        String password, // 映射表单属性不同的参数
                HttpServletRequest req) {
            System.out.println("---方法二---");
            // 优点, 自动转换数据类型, 缺点可能出现数据类型转换异常
            System.out.println(name);
            System.out.println(password);
            try {
                User user = userService.login(name, password);
                // 登录成功将登录用户信息保存到当前会话中
                req.getSession().setAttribute("user", user);
                return "success";
            } catch (NameOrPwdException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "login-form";
            } catch (NullParamException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "login-form";
            } catch (RuntimeException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "error";
            }
        }
    
        @RequestMapping("/login-action3.form")
        public String checkLogin3(User user, HttpServletRequest req) {
            System.out.println("---方法三---");
            // 自动填充到bean对象
            System.out.println(user);
            try {
                user = userService.login(user.getName(), user.getPwd());
                // 登录成功将登录用户信息保存到当前会话中
                req.getSession().setAttribute("user", user);
                return "success";
            } catch (NameOrPwdException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "login-form";
            } catch (NullParamException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "login-form";
            } catch (RuntimeException e) {
                e.printStackTrace();
                req.setAttribute("message", e.getMessage());
                return "error";
            }
        }
    
        @RequestMapping("/login-action4.form")
        public ModelAndView checkLogin4(String name, String pwd,
                HttpServletRequest req) {
            System.out.println("---方法四---");
            Map<String, Object> data = new HashMap<String, Object>();
            try {
                User user = userService.login(name, pwd);
                // 登录成功将登录用户信息保存到当前会话中
                req.getSession().setAttribute("user", user);
                return new ModelAndView("success", data);
            } catch (NameOrPwdException e) {
                e.printStackTrace();
                data.put("message", e.getMessage());
                return new ModelAndView("login-form", data);
            } catch (NullParamException e) {
                e.printStackTrace();
                data.put("message", e.getMessage());
                return new ModelAndView("login-form", data);
            } catch (RuntimeException e) {
                e.printStackTrace();
                data.put("message", e.getMessage());
                return new ModelAndView("error", data);
            }
        }
    
        @RequestMapping("/login-action5.form")
        public String checkLogin5(String name, String pwd, ModelMap model,
                HttpServletRequest req) {
            System.out.println("---方法五---");
            try {
                User user = userService.login(name, pwd);
                // 登录成功将登录用户信息保存到当前会话中
                req.getSession().setAttribute("user", user);
                return "success";
            } catch (NameOrPwdException e) {
                e.printStackTrace();
                model.addAttribute("message", e.getMessage());
                return "login-form";
            } catch (NullParamException e) {
                e.printStackTrace();
                model.addAttribute("message", e.getMessage());
                return "login-form";
            } catch (RuntimeException e) {
                e.printStackTrace();
                model.addAttribute("message", e.getMessage());
                return "error";
            }
        }
    
         @RequestMapping("/login-action6.form")
            public String checkLogin6(
                    @ModelAttribute("name") String name, 
                    @ModelAttribute("password") String pwd,
                    ModelMap model, HttpServletRequest req){
                System.out.println("---方法六---");
                try {
                    User user = userService.login(name, pwd);
                    // 登录成功将登录用户信息保存到当前会话中
                    req.getSession().setAttribute("user", user);
                    return "success";
                } catch (NameOrPwdException e) {
                    e.printStackTrace();
                    model.addAttribute("message", e.getMessage());
                    return "login-form";
                } catch (NullParamException e) {
                    e.printStackTrace();
                    model.addAttribute("message", e.getMessage());
                    return "login-form";
                } catch (RuntimeException e) {
                    e.printStackTrace();
                    model.addAttribute("message", e.getMessage());
                    return "error";
                }
            }
        
        @RequestMapping("/login-action7.form")
        public String checkLogin7(ModelMap model, HttpServletRequest req) {
            System.out.println("---方法七---");
            String name1=req.getParameter("name");
            String pwd1=req.getParameter("pwd");
            try {
                User user = userService.login(name1, pwd1);
                // 登录成功将登录用户信息保存到当前会话中
                req.getSession().setAttribute("user", user);
                return "success";
            } catch (NameOrPwdException e) {
                e.printStackTrace();
                model.addAttribute("message", e.getMessage());
                return "redirect:login";
            } catch (NullParamException e) {
                e.printStackTrace();
                model.addAttribute("message", e.getMessage());
                return "redirect:login";
            } catch (RuntimeException e) {
                e.printStackTrace();
                model.addAttribute("message", e.getMessage());
                return "error";
            }
        }
    
        private String[] msg = { "再来一次", "下次就对了", "没关系还有机会" };
    
        @ModelAttribute("next")
        public String getNext() {
            Random r = new Random();
            return msg[r.nextInt(msg.length)];
        }
    
    }
    复制代码

    5.测试login-action1.form登录流程

    通过网址“http://localhost:8080/SpringValues/login/login.form”请求Tomcat服务器:

     访问请求的信息打印在控制台:

    复制代码
    ---方法一---
    Tom
    123
    利用JDBC技术查找User信息
    ---方法二---
    Tom
    123
    利用JDBC技术查找User信息
    ---方法三---
    0,Tom,123,null
    利用JDBC技术查找User信息
    ---方法四---
    利用JDBC技术查找User信息
    ---方法五---
    利用JDBC技术查找User信息
    复制代码
     
  • 相关阅读:
    【设计模式】适配器模式
    【设计模式】单例模式
    MSScriptControl详解(可实现在C#等语言中调用JAVASCRIPT代码)
    一:简介
    你是否经常想写点什么?
    SQL server2008无法收缩日志
    SqlServer中把结果集放到到临时表的方法(转)
    (转)64位系统安装Delphi7提示Can’t load package:dclite70.bpl 以及 提示地址错误
    太有用了,所以转:Delphi下16进制位图数据转位图
    C# 使用access,报错:标准表达式中数据类型不匹配
  • 原文地址:https://www.cnblogs.com/aibabel/p/7965461.html
Copyright © 2011-2022 走看看