springJava&JAVA EE

Spring接收请求参数和页面传参

2016-10-18  本文已影响603人  今有所思

一、从页面接收参数

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

@RequestMapping("/login.do")  
public String login(HttpServletRequest request) {  
    String name = request.getParameter("name")  
    String pass = request.getParameter("pass")  
} 
    @RequestMapping("/login.do")  
    public String login(HttpServletRequest request,  
    @RequestParam("pass") 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());  
} 

二、向页面传值

  1. 使用Map、Model和ModelMap
    Java代码:

    @RequestMapping("/test")
    public String test(Map<String, Object> map, Model model, ModelMap modelMap){
    
        map.put("names", Arrays.asList("caoyc","zhh","cjx"));
        model.addAttribute("time", new Date());
        modelMap.addAttribute("city", "ChengDu");
        modelMap.put("gender", "male");
        return "hello";
    }
    

    JSP页面:

    1、time:${requestScope.time}<br/>
    2、names:${requestScope.names }<br/>
    3、city:${requestScope.city }<br/>
    4、gender:${requestScope.gender }
    
  2. 使用ModelAndView ModelAndView(String viewName, Map model)

    @RequestMapping("/test")
    public ModelAndView test(){
        ModelAndView mav=new ModelAndView("hello");
        mav.addObject("time", new Date());
        mav.getModel().put("name", "caoyc");
        return mav;
    }
    
  3. 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";  
    } 
    
  4. 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包:
目录结构
  1. 导入前述业务层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');
  1. 为项目添加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工作正常。

  1. 配置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>
  1. 部署项目到Tomcat并且启动,测试Spring MVC配置是否正常。

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

步骤二:实现login-action1.form登录流程,测试利用HttpServletRequrst传值方法
  1. 在WEB-INF/jsp文件夹下添加login-form.jsp文件,代码如下所示:
    原文
上一篇下一篇

猜你喜欢

热点阅读