Controller 接收请求参数的方式有很多种,有的适合 get 请求方式,有的适合 post 请求方式,有的两者都适合。下面分别介绍这些方式,读者可以根据实际情况选择合适的接收方式。

通过实体 Bean 接收请求参数

通过一个实体 Bean 来接收请求参数,适用于 get 和 post 提交请求方式。需要注意的是,Bean 的属性名称必须与请求参数名称相同。下面通过具体应应用 springMVCDemo02 讲解“通过实体 Bean 接收请求参数”。

1)创建首页面

在 springMVCDemo02 应用的 WebContent 目录下修改 index.jsp 页面,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>没注册的用户,请<a href="${pageContext.request.contextPath }/index/register"> 注册</a>!<br/>已注册的用户,去<a href="${pageContext.request.contextPath }/index/login"> 登录</a>!
</body>
</html>

2)完善配置文件

完善配置文件 springmvc-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:mvc="http://www.springframework.org/schema/mvc"xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 使用扫描机制扫描控制器类,控制器类都在controller包及其子包下 --><context:component-scan base-package="controller" /><mvc:annotation-driven /><!-- annotation-driven用于简化开发的配置,注解DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter --><!-- 使用resources过滤掉不需要dispatcherservlet的资源(即静态资源,例如css、js、html、images)。在使用resources时必须使用annotation-driven,否则resources元素会阻止任意控制器被调用 --><!-- 允许css目录下的所有文件可见 --><mvc:resources location="/css/" mapping="/css/**" /><!-- 允许html目录下的所有文件可见 --><mvc:resources location="/html/" mapping="/html/**" /><!-- 允许css目录下的所有文件可见 --><mvc:resources location="/images/" mapping="/images/**" /><!-- 完成视图的对应 --><!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 --><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean>
</beans>

3)创建 POJO 实体类

在 springMVCDemo02 应用的 src 目录下创建 pojo 包,并在该包中创建实体类 UserForm,代码如下:

package pojo;
public class UserForm {private String uname; // 与请求参数名称相同private String upass;private String reupass;// 省略getter和setter方法
}

4)创建控制器类

在 springMVCDemo02 应用的 controller 包中创建控制器类 IndexController 和 UserController。

IndexController 的代码如下:

package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/index")
public class IndexController {@RequestMapping("/login")public String login() {return "login"; // 跳转到/WEB-INF/jsp下的login.jsp}@RequestMapping("/register")public String register() {return "register";}
}

UserController 的代码如下:

package controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.UserForm;
import com.sun.org.apache.commons.logging.Log;
import com.sun.org.apache.commons.logging.LogFactory;
@Controller
@RequestMapping("/user")
public class UserController {// 得到一个用来记录日志的对象,这样在打印信息的时候能够标记打印的是哪个类的信息private static final Log logger = LogFactory.getLog(UserController.class);/*** 处理登录 使用UserForm对象(实体Bean) user接收注册页面提交的请求参数*/@RequestMapping("/login")public String login(UserForm user, HttpSession session, Model model) {if ("zhangsan".equals(user.getUname())&& "123456".equals(user.getUpass())) {session.setAttribute("u", user);logger.info("成功");return "main"; // 登录成功,跳转到 main.jsp} else {logger.info("失败");model.addAttribute("messageError", "用户名或密码错误");return "login";}}/*** 处理注册 使用UserForm对象(实体Bean) user接收注册页面提交的请求参数*/@RequestMapping("/register")public String register(UserForm user, Model model) {if ("zhangsan".equals(user.getUname())&& "123456".equals(user.getUpass())) {logger.info("成功");return "login"; // 注册成功,跳转到 login.jsp} else {logger.info("失败");// 在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute("uname", user.getUname());return "register"; // 返回 register.jsp}}
}

5)创建页面视图

在 springMVCDemo02 应用的 /WEB-INF/jsp 目录下创建 register.jsp 和 login.jsp。

register.jsp 的核心代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><form action="${pageContext.request.contextPath }/user/register" method="post" name="registForm"><table border=1 bgcolor="lightblue" align="center"><tr><td>姓名:</td><td><input class="textSize" type="text" name="uname" value="${uname }" /></td></tr><tr><td>密码:</td><td><input class="textSize" type="password" maxlength="20" name="upass" /></td></tr><tr><td>确认密码:</td><td><input class="textSize" type="password" maxlength="20" name="reupass" /></td></tr><tr><td colspan="2" align="center"><input type="button" value="注册" onclick="allIsNull() " /></td></tr></tab1e></form>
</body>
</html>

在 register.jsp 的代码中使用了 EL 语句“$1{uname}”取出“model.addAttribute(“uname”,user.getUname())”中的值。对于 EL 和 JSTL 的相关知识,读者可参考《JSP教程》。

login.jsp 的核心代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body><form action="${pageContext.request.contextPath }/user/login" method="post"><table><tr><td colspan="2"><img src="${pageContext.request.contextPath }/images/login.gif"></td></tr><tr><td>姓名:</td><td><input type="text" name="uname" class="textSize"></td></tr><tr><td>密码:</td><td><input type="password" name="upass" class="textsize"></td></tr><tr><td colspan="2"><input type="image" src="${pageContext.request.contextPath }/images/ok.gif" onclick="gogo()"><input type="image" src="${pageContext.request.contextPath }/images/cancel.gif" onclick="cancel()"></td></tr></table>${messageError }</form>
</body>
</html>

6)测试应用

运行 springMVCDemo02 应用的首页面,进行程序测试。

通过处理方法的形参接收请求参数

通过处理方法的形参接收请求参数也就是直接把表单参数写在控制器类相应方法的形参中,即形参名称与请求参数名称完全相同。该接收参数方式适用于get 和 post 提交请求方式。用户可以将“通过实体 Bean 接收请求参数”部分中控制器类 UserController 中 register 方法的代码修改如下:

@RequestMapping("/register")
/**
* 通过形参接收请求参数,形参名称与请求参数名称完全相同
*/
public String register(String uname,String upass,Model model) {if ("zhangsan".equals(uname)&& "123456".equals(upass)) {logger.info("成功");return "login"; // 注册成功,跳转到 login.jsp} else {logger.info("失败");// 在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute("uname", uname);return "register"; // 返回 register.jsp}
}

通过 HttpServletRequest 接收请求参数

通过 HttpServletRequest 接收请求参数适用于 get 和 post 提交请求方式,可以将“通过实体 Bean 接收请求参数”部分中控制器类 UserController 中register 方法的代码修改如下:

@RequestMapping("/register")
/**
* 通过HttpServletRequest接收请求参数
*/
public String register(HttpServletRequest request,Model model) {String uname = request.getParameter("uname");String upass = request.getParameter("upass");if ("zhangsan".equals(uname)&& "123456".equals(upass)) {logger.info("成功");return "login"; // 注册成功,跳转到 login.jsp} else {logger.info("失败");// 在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute("uname", uname);return "register"; // 返回 register.jsp}
}

通过 @PathVariable 接收 URL 中的请求参数

通过 @PathVariable 获取 URL 中的参数,控制器类示例代码如下:

@Controller
@RequestMapping("/user")
public class UserController {@RequestMapping("/user")// 必须节method属性/*** 通过@PathVariable获取URL的参数*/public String register(@PathVariable String uname,@PathVariable String upass,Model model) {if ("zhangsan".equals(uname)&& "123456".equals(upass)) {logger.info("成功");return "login"; // 注册成功,跳转到 login.jsp} else {// 在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute("uname", uname);return "register"; // 返回 register.jsp}}
}

在访问“http://localhost:8080/springMVCDemo02/user/register/zhangsan/123456”路径时,上述代码自动将 URL 中的模板变量 {uname} 和{upass} 绑定到通过 @PathVariable 注解的同名参数上,即 uname=zhangsan、upass=123456。

通过 @RequestParam 接收请求参数

通过 @RequestParam 接收请求参数适用于 get 和 post 提交请求方式,可以将“通过实体 Bean 接收请求参数”部分控制器类 UserController 中register 方法的代码修改如下:

@RequestMapping("/register")
/**
* 通过@RequestParam接收请求参数
*/
public String register(@RequestParam String uname,@RequestParam String upass, Model model) {if ("zhangsan".equals(uname) && "123456".equals(upass)) {logger.info("成功");return "login"; // 注册成功,跳转到 login.jsp} else {// 在register.jsp页面上可以使用EL表达式取出model的uname值model.addAttribute("uname", uname);return "register"; // 返回 register.jsp}
}

通过 @RequestParam 接收请求参数与“通过处理方法的形参接收请求参数”部分的区别如下:当请求参数与接收参数名不一致时,通过处理方法的形参接收请求参数”不会报 404 错误,而“通过 @RequestParam 接收请求参数”会报 404 错误。

通过 @ModelAttribute 接收请求参数

当 @ModelAttribute 注解放在处理方法的形参上时,用于将多个请求参数封装到一个实体对象,从而简化数据绑定流程,而且自动暴露为模型数据,在视图页面展示时使用。

而“通过实体 Bean 接收请求参数”中只是将多个请求参数封装到一个实体对象,并不能暴露为模型数据(需要使用 model.addAttribute 语句才能暴露为模型数据,数据绑定与模型数据展示后面教程中会讲解)。

通过 @ModelAttribute 注解接收请求参数适用于 get 和 post 提交请求方式,可以将“通过实体 Bean 接收请求参数”中控制器类 UserController 中register 方法的代码修改如下:

@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {if ("zhangsan".equals(uname) && "123456".equals(upass)) {logger.info("成功");return "login"; // 注册成功,跳转到 login.jsp} else {logger.info("失败");// 使用@ModelAttribute("user")与model.addAttribute("user",user)的功能相同//register.jsp页面上可以使用EL表达式${user.uname}取出ModelAttribute的uname值return "register"; // 返回 register.jsp}
}

Spring MVC获取参数的几种常见方式相关推荐

  1. Spring 中获取 request 的几种方法,及其线程安全性分析

    概述 在使用Spring MVC开发Web系统时,经常需要在处理请求时使用request对象,比如获取客户端ip地址.请求的url.header中的属性(如cookie.授权信息).body中的数据等 ...

  2. SpringMVC获取参数的几种方式

    SpringMVC获取参数的几种方式 前言: 年末了,忙了一年了却发现系统的整理的东西很少,一些基础的东西都未做整理,这里就将它随便整理一下,增加一些印象,当然在网上看到一些好的资料也会整理下来以备后 ...

  3. Linux软件安装的几种常见方式介绍

    Linux上的软件安装有以下几种常见方式介绍 1. 二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 2. RPM包 软件已经按照redhat的包管理工具规范RPM进行打包发布, ...

  4. Spring AOP拦截规则的两种定义方式

    Spring AOP拦截规则的两种定义方式 AOP的根本目的就是解耦,分开业务代码与系统共用代码,例如打印日志. Spring支持AspectJ的注解式切面编程,主要包含4个部分,分别是 使用@Asp ...

  5. 数据库优化几种常见方式

    数据库优化几种常见方式 一.数据库编码规范 1)从 JDBC 编程的角度讲,用 PreparedStatement 一般来说比 Statement 性能高,因为在使用 时,SQL 语句被预编译并存储在 ...

  6. jedis watch Java_jedis操作redis的几种常见方式总结

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...

  7. android 多线程间通信,android实现线程间通信的四种常见方式

    1,通过Handler机制 主线程中定义Handler,子线程发消息,通知Handler完成UI更新,Handler对象必须定义在主线程中,如果是多个类直接互相调用,就不是很方便,需要传递conten ...

  8. 国际商标注册4种常见方式

    国际商标注册4种常见方式 国际商标注册常见几种注册方式:一是单个国家商标注册,二是马德里商标国际注册,三是欧盟商标注册,四是非洲知识产权组织商标注册. 1.单一国家注册 指直接向各个国家/地区商标主管 ...

  9. Java中定义字符串的两种常见方式、使用==和equals()比较字符串

    在讲使用==和equals()比较字符串之前,我们首先要讲定义字符串的两种常见方式,一种是定义一个常量,即直接定义字符串,一种是通过new关键字定义一个变量,即使用String类定义字符串,如下图: ...

最新文章

  1. Sonar代码质量管理
  2. finalshell Linux 传输文件 xftp
  3. linux DNS服务器配置
  4. linux看进程所在,linux 查看进程所在目录
  5. Oracle 查询当前日期
  6. 专辑一:爱之初体验(初级)
  7. boost::intrusive::member_value_traits用法的测试程序
  8. javascript的id、class、元素选择器
  9. CSS分别设置Input样式(按input类型
  10. dup java_java web----TCP/DUP 通信
  11. 一文读懂Xgboost
  12. Express框架的使用教程
  13. 【连载】听程序员部落酋长畅谈关于软件的人和事-节选3
  14. Android 接入穿山甲SDK之插屏广告
  15. SSH综合项目实战(快递) -- day07 定区关联快递员、搭建前台、客户注册
  16. python闯关2-罗马数字编码
  17. WIN7 | 网络正常,但网页打不开 | 远程计算机或设备不接受连接
  18. Arcgis desktop 10及Arcgis Engine 10破解
  19. 关于MPU6050学习的一些总结之三MPU6050程序解读
  20. 前端技术火爆的原因,为什么更多的人转行进入前端

热门文章

  1. 审计文件服务器的5个核心要素
  2. 使用dig或nslookup指定dns服务器查询域名解析
  3. Docker学习总结(68)—— Docker 数据卷相关知识总结
  4. Linux学习总结(68)——Linux 30年专访:Linus Torvalds谈Linux内核开发与Git
  5. Linux学习总结(57)——生产环境用户权限管理规范
  6. Maven学习总结(45)——Maven仓库、将本地Jar包安装到仓库、打可执行的Jar总结
  7. Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
  8. Shiro学习总结(2)——Apache Shiro快速入门教程
  9. Java基础学习总结(19)——Java环境变量配置
  10. cnpm 网络不能连接_5G网络那么牛,能打电话吗?(连载二)