Controller接受请求参数的常见方法:

1、通过Bean接受请求参数:

创建POJO实体类

创建pojo包,并在该包中创建实体类UserForm,代码:

package pojo;
public class UserForm {
private String uname;//与请求参数名称相同
private String upass;
private String reupass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getReupass() {
return reupass;
}
public void setReupass(String reupass) {
this.reupass = reupass;
}
}

创建控制器类,在controller包中创建控制器类IndexController和UserController

其中@RequestMapping注解的作用个人浅显的理解就是将方法或类注解为一个“路径”的名称,以便在HTML,JSP(视图)向控制器发送请求时寻找到。

IndexController代码:

package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller//在这里@Controller相当于@Controller(“indexController”)
@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.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.UserForm;
import service.UserService;
@Controller//在这里@Controller相当于@Controller(“userController”)
@RequestMapping("/user")
public class UserController {
//得到一个用来记录日志的对象,这样打印信息的时候能够标记打印的是那个类的信息
private static final Log logger = LogFactory.getLog(UserController.class);
//将服务依赖注入到属性userService
@Autowired
public UserService userService;
/**
* 处理登录
*/
@RequestMapping("/login")
public String login(UserForm user, HttpSession session, Model model) {
if(userService.login(user)){
session.setAttribute("u", user);
logger.info("成功");
return "main";//登录成功,跳转到main.jsp
}else{
logger.info("失败");
model.addAttribute("messageError", "用户名或密码错误");
return "login";
}
}
/**
*处理注册
*/
@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
if(userService.register(user)){
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
}
}
}

创建页面视图,结合视图中更能理解@RequestMapping注解的作用,其中关于本次知识的核心代码为<body>标签中的内容:

创建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">
<style type="text/css">
.textSize{
width: 100pt;
height: 15pt
}
</style>
<title>注册画面</title>
<script type="text/javascript">
//注册时检查输入项
function allIsNull(){
var name=document.registForm.uname.value;
var pwd=document.registForm.upass.value;
var repwd=document.registForm.reupass.value;
if(name==""){
alert("请输入姓名!");
document.registForm.uname.focus();
return false;
}
if(pwd==""){
alert("请输入密码!");
document.registForm.upass.focus();
return false;
}
if(repwd==""){
alert("请输入确认密码!");
document.registForm.reupass.focus();
return false;
}
if(pwd!=repwd){
alert("2次密码不一致,请重新输入!");
document.registForm.upass.value="";
document.registForm.reupass.value="";
document.registForm.upass.focus();
return false;
}
document.registForm.submit();
return true;
}
</script>
</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="${user.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>
</table>
</form>
</body>
</html>

创建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>后台登录</title>
<style type="text/css">
table{
text-align: center;
}
.textSize{
width: 120px;
height: 25px;
}
* {
margin: 0px;
padding: 0px;
}
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
margin: 10px 10px auto;
background-image: url(${pageContext.request.contextPath }/images/bb.jpg);
}
</style>
<script type="text/javascript">
//确定按钮
function gogo(){
document.forms[0].submit();
}
//取消按钮
function cancel(){
document.forms[0].action = "";
}
</script>
</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>

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

即将控制类UserConttroller中的register方法的代码修改如下:

@RequestMapping("/register")
/**
*通过形参的计收请求参数,形参名称与请求参数名称完全相同
*/
public String register(String uname,String upass,Model model) {
if(userService.equals(uname)&&userService.equals(upass)){
logger.info("成功");
return "login";//注册成功,跳转到login.jsp
}else{
logger.info("失败");
return "register";//返回register.jsp
}
}

3、通过HttpServetRequest接受请求参数(推荐使用):

即将控制类UserConttroller中的register方法的代码修改如下:

    @RequestMapping("/register")
public String register(HttpServletRequest request,Model model) {
String uname = request.getParameter("uname");
String upass = request.getParameter("upass");
if(userService.equals(uname)&&userService.equals(upass)){
logger.info("成功");
return "login";//注册成功,跳转到login.jsp
}else{
logger.info("失败");
return "register";//返回register.jsp
}
}

其他@PathVariable、@RequestParam等不多赘述,原理相同。

Spring MVC的Controller接受请求方式以及编写请求处理方法的更多相关文章

  1. Spring MVC(三)--控制器接受普通请求参数

    Spring MVC中控制器接受参数的类方式有以下几种: 普通参数:只要保证前端参数名称和传入控制器的参数名称一致即可,适合参数较少的情况: pojo类型:如果前端传的是一个pojo对象,只要保证参数 ...

  2. Spring MVC体系结构和处理请求控制器

    Spring MVC体系结构和处理请求控制器 一:MVC设计模式: (1.)数据访问接口:DAO层 (2.)处理业务逻辑层:Service层 (3.)数据实体:POJO (4.)负责前段请求接受并处理 ...

  3. Spring MVC(八)--控制器接受简单列表参数

    有些场景下需要向后台传递一个数组,比如批量删除传多个ID的情况,可以使用数组传递,数组中的ID元素为简单类型,即基本类型. 现在我的测试场景是:要从数据库中查询minId<id<maxId ...

  4. Spring MVC 原理探秘 - 一个请求的旅行过程

    1.简介 在前面的文章中,我较为详细的分析了 Spring IOC 和 AOP 部分的源码,并写成了文章.为了让我的 Spring 源码分析系列文章更为丰富一些,所以从本篇文章开始,我将来向大家介绍一 ...

  5. 针对spring mvc的controller内存马-学习和实验

    1 基础 实际上java内存马的注入已经有很多方式了,这里在学习中动手研究并写了一款spring mvc应用的内存马.一般来说实现无文件落地的java内存马注入,通常是利用反序列化漏洞,所以动手写了一 ...

  6. spring mvc返回json字符串的方式

    spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json            优点:不需要自己再处理 步骤一:在spring- ...

  7. Spring mvc框架 controller间跳转 ,重定向 ,传参

     一.需求背景     1. 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示.   @Req ...

  8. spring mvc在Controller中获取ApplicationContext

    spring mvc在Controller中获取ApplicationContext web.xml中进行正常的beans.xml和spring-mvc.xml的配置: 需要在beans.xml中进行 ...

  9. Spring MVC 之@Controller@RequestMapping详解

    一:配置web.xml 1)问题:spring项目中有多个配置文件mvc.xml   dao.xml 2)解决:在web.xml中 <init-param> <param-name& ...

随机推荐

  1. 用robotframework 标准库String解决由于存在千分位分隔符导致两个数值不相等的问题。

    在编写robotframework自动化断言的过程中,我遇到了如下问题: 我想写一个两个金额判断是否相等的断言,其中一个金额是展示字段存在千分位分隔符,另一个金额是input带入字段,没有千分位分隔符 ...

  2. 盘点一下Github上开源的编程面试/学习相关的仓库

    转载自:JavaGuide 最近浏览 Github ,收藏了一些还算不错的 Java面试/学习相关的仓库,分享给大家,希望对你有帮助.我暂且按照目前的 Star 数量来排序. 本文由 SnailCli ...

  3. "二号标题"组件:<h2> —— 快应用组件库H-UI

     <import name="h2" src="../Common/ui/h-ui/text/c_h2"></import> < ...

  4. alg-链表中有环

    typedef struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }ListN ...

  5. push和appendChild的区别

    概述:绑定事件(push和appendChild用法相似:但是一个是控制数组,一个是控制元素节点)用法:1.数组1的更改后的长度 = 数组1.push();//用来控制数组,在数组最后面插入项,返回数 ...

  6. 经典算法之归并排序——python和JS实现

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:韩忠康 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...

  7. ATcoder E - Flatten 质因子分解求LCM

    题解:其实就是求n个数的lcm,由于数据特别大,求lcm时只能用质因子分解的方法来求. 质因子分解求lcm.对n个数每个数都进行质因子分解,然后用一个数组记录某个质因子出现的最大次数.然后累乘pow( ...

  8. Android内存优化—dumpsys meminfo详解

    原创置顶 不死鸟JGC 最后发布于2018-12-24 14:19:28 阅读数 3960 收藏展开dumpsys 介绍Dumpsys用户系统诊断,它运行在设备上,并提供系统服务状态信息 命令格式: ...

  9. search(6)- elastic4s-CRUD

    如果我们把ES作为某种数据库来使用的话,必须熟练掌握ES的CRUD操作.在这之前先更正一下上篇中关于检查索引是否存在的方法:elastic4s的具体调用如下: //删除索引 val rspExists ...

  10. 联通友华通信光纤猫PT952G设置无线路由光猫桥接拨号

    #0x1 登陆后台,点击网络,点击宽带设置.选择第二个接口. 0x2 只修改模式,改成Bridge,其他无需修改.然后直接接路由器拨号就行,或者电脑都行. 0x4  恢复默认拨号,这样修改以后,直接连 ...