目的:请求参数接受,输出,常见的注解(在上一篇入门1基础上)

1:请求参数的绑定

1.1绑定的机制

表单中请求参数都是基于key=value的。 SpringMVC绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

1.2基本类型参数 请求参数:?userName=lsw&psw=123

   <%--请求参数绑定--%>
<a href="Param/testParam?userName=lsw&psw=123">请求参数绑定</a>

控制器:

    /**
* url 地址 Param/testParam?userName=lsw&psw=123
* @param userName
* @param pwd
* @return
*/
@RequestMapping(value = "testParam",method = {RequestMethod.GET})
public String testParam(String userName,String pwd){
System.out.println( "testParam" );
System.out.println( "用户名:"+userName );
return "sucess";
}

插曲:注解的一个参数不知道怎么写,选中ctrl+b 进去看源代码,比如RequestMapping

1.3 POJO类型参数: 包括实体类,以及关联的实体类,集合类型(list map)

user类:
 package cn.lsw.domain;

 import java.util.List;
import java.util.Map; /**
* Create by on 2019-09-16
* 请求参数绑定
* @author lsw
*/
public class user { private String userName;
private String pwd;
private int age; /**
* 引用类型
*/
private Address address; /**
* 集合
*/
private List<Address> addressList; /**
* map
*/
private Map<String,Address> map; public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getPwd() {
return pwd;
} public void setPwd(String pwd) {
this.pwd = pwd;
} public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public List<Address> getAddressList() {
return addressList;
} public void setAddressList(List<Address> addressList) {
this.addressList = addressList;
} public Map<String, Address> getMap() {
return map;
} public void setMap(Map<String, Address> map) {
this.map = map;
} @Override
public String toString() {
return "user{" +
"userName='" + userName + '\'' +
", pwd='" + pwd + '\'' +
", age=" + age +
", address=" + address +
", addressList=" + addressList +
", addressMap=" + map +
'}';
}
}

address:

package cn.lsw.domain;

/**
* Create by on 2019-09-16
*
* @author lsw
*/
public class Address {
private String address; public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} }

控制器:

    /**
* 请求数据封装到javaBean的类中
* @param user
* @return
*/
@RequestMapping("saveUse")
public String saveUse(user user){
System.out.println( user.toString());
return "sucess";
}
   <form action="Param/saveUse" method="post">
用户名称:<input type="text" name="userName" ><br/>
用户密码:<input type="password" name="pwd" ><br/>
用户年龄:<input type="text" name="age" ><br/>
地址:<input type="text" name="address.address" ><br/>
张三地址:<input type="text" name="addressList[0].address" ><br/>
李四地址:<input type="text" name="addressList[1].address" ><br/>
张三map地址:<input type="text" name="map['one'].address" ><br/>
李四map地址:<input type="text" name="map['two'].address" ><br/>
<input type="submit" value="保存">
</form>

运行结果:

问题:中文乱码解决:web.xml添加

  <!--配置解决中文乱码的过滤器开始-->
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

1.4特殊情况 类型转换问题(比如Date)

html:

   <%--date--%>
<a href="Param/deleteUse?date=2019-01-01">date</a>

控制器:

    /**
* 删除账户
* @return
*/
@RequestMapping("/deleteUse")
public String deleteUse(Date date)
{
System.out.println("删除了账户。。。。"+date);
return "success";
}

运行结果:

控制台打印:大概意思字符串2019-01-01无法转换date

16-Sep-2019 11:13:01.434 警告 [http-apr-9999-exec-2] org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleTypeMismatch Failed to bind request element: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2019-01-01'; nested exception is java.lang.IllegalArgumentException

解决办法:自定义转换器

StringToDateConverter:
package cn.lsw.common;

/**
* Create by on 2019-09-16
*
* @author lsw
*/ import org.springframework.core.convert.converter.Converter; import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* 把字符串转换日期
*/
public class StringToDateConverter implements Converter<String,Date> { /**
* String source 传入进来字符串
* @param source
* @return
*/
@Override
public Date convert(String source) {
// 判断
if(source == null){
throw new RuntimeException("请您传入数据");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); try {
// 把字符串转换日期
return df.parse(source);
} catch (Exception e) {
throw new RuntimeException("数据类型转换出现错误");
}
} }

springMvc.xml添加,修改

    <!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.lsw.common.StringToDateConverter"/>
</set>
</property>
</bean> <!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven conversion-service="conversionService"/>

运行结果:

1.5 控制器获取原生的servlet API

控制器:

    /**
* 原生的API 自己在参数上面写上HttpServletRequest,HttpServletResponse
* @return
*/
@RequestMapping("/testServlet")
public String testServlet(HttpServletRequest request, HttpServletResponse response){
System.out.println("用户名:"+request.getParameter("name")); HttpSession session = request.getSession();
System.out.println(session); ServletContext servletContext = session.getServletContext();
System.out.println(servletContext); System.out.println(response);
return "sucess";
}

html:

   <%--原生的API--%>
<a href="Param/testServlet?name=lsw">原生的API</a>

运行结果:

2:注解

2.1 RequestParam ,把请求中指定名称的参数给控制器中的形参赋值。

个人理解:给url地址的name起个别名(个人感觉实际运用不多)

新建一个控制器:AnnoController

package cn.lsw.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; /**
* Create by on 2019-09-16
* 注解
* @author lsw
*/
@Controller
@RequestMapping("/anno")
public class AnnoController { @RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
System.out.println("执行了...");
System.out.println(username);
return "sucess";
} }

html:

<a href="anno/testRequestParam?name=lsw">请求参数绑定</a> <br><br>

注意:url 参数的名称是userName 控制器的参数是@RequestParam(name="name") String username

运行结果:

2.2 RequestBody (总结:针对post请求 参数不用定义实体类 方便)

作用: 用于获取请求体内容。直接使用得到是key=value&key=value...结构的数据。 get请求方式不适用。

控制器:

    /**
* 获取到请求体的内容
* @return
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了...");
System.out.println(body);
return "sucess";
}

html:

    <form action="anno/testRequestBody" method="post">
用户姓名:<input type="text" name="username" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>

运行结果:

springMvc 入门二的更多相关文章

  1. springMVC入门二

    一.准备工作 参考springMVC入门一,搭建maven项目如下: 前台结构如下: 项目介绍:使用springMVC实现前后台数据交互,例如controller返回json,页面传入pojo 二.具 ...

  2. SpringMVC入门二: 1规范结构, 2简单整合MyBatis

    昨天拿springMVC写的helloworld结构不好, 这次先调整一下体系结构 , 然后简单整合一下MyBatis spring的配置还是以注解为主, 不过MyBatis的映射文件什么的还是拿xm ...

  3. SpringMVC入门二:SSM整合(spring+springmvc+mybatis)

    一.编程步骤 1.引入依赖 spring.springmvc.mybatis.mybatis-spring.mysql.druid.log4j.servlet-api.jstl.fastjson 2. ...

  4. SpringMvc入门二----HelloWorld

    1. 导入需要的架包: 2. 配置web.xml,添加Servlet <servlet> <servlet-name>springmvc</servlet-name> ...

  5. <SpringMvc>入门二 常用注解

    1.@RequestMapping @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME ...

  6. Spring+SpringMVC+MyBatis深入学习及搭建(十二)——SpringMVC入门程序(一)

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6999743.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十一)——S ...

  7. SpringMVC入门学习(二)

    SpringMVC入门学习(二) ssm框架 springMVC  在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. mo ...

  8. SpringMVC.入门篇《二》form表单

    SpringMVC.入门篇<二>form表单 项目工程结构: 在<springmvc入门篇一.HelloWorld>基础上继续添加代码,新增:FormController.ja ...

  9. Java开发学习(二十三)----SpringMVC入门案例、工作流程解析及设置bean加载控制

    一.SpringMVC概述 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装.SpringMVC是处于Web层的框架,所以其主要的作用就是用来 ...

随机推荐

  1. Hive中的HiveServer2、Beeline及数据的压缩和存储

    1.使用HiveServer2及Beeline HiveServer2的作用:将hive变成一种server服务对外开放,多个客户端可以连接. 启动namenode.datanode.resource ...

  2. 支付宝支付 微信支付SDK接口不统一? 盘他!

      开发过支付宝.微信支付的同学都知道,微信的支付 API 设计感觉是 Java 开发工程师写的,远不如支付宝 SDK 的接口设计用起来顺手.在这里,统一封装微信支付和支付宝支付的API,使两种支付方 ...

  3. 使用SAP Cloud Application Programming模型开发OData的一个实际例子

    刚刚过去的SAP TechEd上,SAP CTO Juergen Mueller向外界传递了一个重要的信息:身处云时代大环境下的SAP从业者,在SAP云平台上该如何选择适合自己的开发方式? Juerg ...

  4. Linu如何查看磁盘占用情况及处理办法

    free -h: 查看当前剩余的内存大小 df: 查看文件系统磁盘使用率,可能free -h得到的剩余空间还有很多,但是df查询得到的部分文件系统磁盘使用率较高 当发现磁盘使用率较高的时候,可以: 先 ...

  5. Python爬虫系列:四、Cookie的使用

    Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...

  6. python测试开发django-42.xadmin自定义菜单项

    前言 xadmin后台的菜单项是放到一个app下的,并且里面的排序是按字母a-z排序,有时候我们需要划分多个项,需要自定义菜单列表,可以通过重写CommAdminView类实现.xadmin后台提供了 ...

  7. Linux命令——jobs、bg、fg、nohup

    参考:Bash基础——工作管理(Job control) jobs -l :除了列出 job number 与命令串之外,同时列出 PID 的号码: -r :仅列出正在背景 run 的工作:-s :仅 ...

  8. 小白式Git使用教程,从0到1

    Git是什么? Git是目前世界上最先进的分布式版本控制系统.工作原理 / 流程: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remo ...

  9. 用Python添加写入数据到已经存在的Excel的xlsx文件

    # coding:utf-8 from openpyxl import load_workbook import openpyxl # 写入已存在的xlsx文件第一种方法 # class Write_ ...

  10. python内置模块笔记(持续更新)

    常用函数name = '{wh}my \t name is {name},age is {age}.' print(name.capitalize()) # 字符串的开头字母大写 print(name ...