springmvc-210803-02---处理器方法的参数&Post请求中文乱码

springmvc-210803-02—处理器方法的参数&Post请求中文乱码


处理器方法的四类参数

处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。
    ➢ HttpServletRequest
    ➢ HttpServletResponse
    ➢ HttpSession
    ➢ 请求中所携带的请求参数
    	1) 逐个接收
    	2) 对象接收

下面演示—请求中所携带的请求参数

在提交请求参数时,
get请求方式没有中文乱码,
post提交请求,会出现中文乱码,需要使用过滤器处理乱码问题。

过滤器可以自定义,也可以使用框架提供的过滤器CharacterEncodingFilter。

index.jsp(主页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>springmvc</title>
</head>
<body>
    <form action="test/some.do" method="post">
        <span>测试逐个接收参数</span>
        <br/>
        <span>name:</span><input type="text" name="name"/>
        <br/>
        <span>age:</span><input type="text" name="age"/>
        <br/>
        <button type="submit">提交</button>
    </form>

    <hr/>
    <hr/>
    <hr/>

    <form action="test/testRequestParam.do" method="post">
        <span>测试注解@RequestParam</span>
        <br/>
        <span>name:</span><input type="text" name="u_name"/>
        <br/>
        <span>age:</span><input type="text" name="u_age"/>
        <br/>
        <button type="submit">提交</button>
    </form>

    <hr/>
    <hr/>
    <hr/>

    <form action="test/testReceiveObjectParam.do" method="post">
        <span>测试接收对象参数</span>
        <br/>
        <span>name:</span><input type="text" name="u_name"/>
        <br/>
        <span>age:</span><input type="text" name="u_age"/>
        <br/>
        <button type="submit">提交</button>
    </form>
</body>
</html>

MyController.java(处理器—处理请求参数)

package com.bgy.controller;

import com.bgy.vo.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping("/test")
public class MyController {

    /**
     *  测试逐个接收请求参数:
     *         要求:处理器方法的形参名和请求中的形参名必须一致,
     *              同名的请求参数赋值给同名的形参。
     *
     *         框架接收请求参数:
     *             1. 使用request对象接收请求参数  doSome(HttpServletRequest request){}
     *                String u_name = request.getParameter("name");
     *                String u_age = request.getParameter("age");
     *
     *             2. springmvc框架通过DispatcherServlet,调用MyController的doSome(),
     *                按名称对应,把接收的参数赋值给形参,
     *                框架会提供类型转换功能,能把String转换为int,long,float,double等。
     */
    /*
        这个方法doSome(String name , Integer age)的参数要和jsp页面的形参一样

        Integer age 如果不用包装类定义,,而是这样定义 int age,
        当参数为空的时候,会报错,
        浏览器页面报错:HTTP Status 400
        控制台报错:Failed to convert value of type 'java.lang.String' to required type 'int';
            也就是说无法把空值转换为数字
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name , Integer age){
        ModelAndView mv= new ModelAndView();
        mv.addObject("u_name",name);
        mv.addObject("u_age",age);
        mv.addObject("message","这是测试逐个接收请求");

        System.out.println(name+" : "+age);
        mv.setViewName("show");

        // 返回mv
        return mv;
    }

    /**
     *  测试注解@RequestParam
     *
     *  注解@RequestParam用来解决请求中参数名和处理器方法中参数名不一致,
     *  用在逐个接收对象中。
     *      属性value:请求中的参数名称
     *      位置:在处理器方法形参定义前面----> @RequestParam(value = "u_name") String name
     */
    @RequestMapping(value = "/testRequestParam.do")
    public ModelAndView testRequestParam(@RequestParam(value = "u_name") String name , @RequestParam(value = "u_age")Integer age){
        ModelAndView mv= new ModelAndView();
        mv.addObject("u_name",name);
        mv.addObject("u_age",age);
        mv.addObject("message","这是测试注解@RequestParam");

        System.out.println(name+" : "+age);
        mv.setViewName("show");

        // 返回mv
        return mv;
    }

    /**
     *  测试接收对象参数
     *
     *  处理器方法的形参是java对象,这个对象中的属性要和请求中的参数名一致。
     *  框架爱会自动创建java对象,给属性赋值
     */
    @RequestMapping(value = "/testReceiveObjectParam.do")
    public ModelAndView testReceiveObjectParam(Student student){

        System.out.println(student);
        ModelAndView mv= new ModelAndView();

        mv.addObject("u_name",student.getU_name());
        mv.addObject("u_age",student.getU_age());
        mv.addObject("message","这是测试接收对象参数");

        mv.setViewName("show");

        // 返回mv
        return mv;
    }
}

web.xml(配置过滤器解决post中文乱码)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">

  <!-- 配置过滤器,解决post请求中文乱码问题 -->
  <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>

    <!-- 强制请求对象(HttpServletResponse)使用encoding编码的值 -->
    <init-param>
      <param-name>forceResponseEncoding</param-name>
      <param-value>true</param-value>
    </init-param>

    <!-- 强制应答对象(HttpServletRequest)使用encoding编码的值 -->
    <init-param>
      <param-name>forceRequestEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <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:springmvc.xml</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

</web-app>

show.jsp(结果页面)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>show</title>
</head>
<body>
    <span>message:${message}</span>
    <br/>
    <span>u_name:${u_name}</span>
    <br/>
    <span>u_age:${u_age}</span>
</body>
</html>

springmvc.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context
                           http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 开启组件扫描 -->
    <context:component-scan base-package="com.bgy.controller"></context:component-scan>

    <!-- 声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/view/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

Student.java

package com.bgy.vo;

public class Student {

    // 使用对象接收,这里的参数要和请求中的参数名保持一致。
    private String u_name;
    private String u_age;

    public Student() {
        System.out.println("Student无参构造执行了。。。。。");
    }

    public String getU_name() {
        return u_name;
    }

    public void setU_name(String u_name) {
        this.u_name = u_name;
    }

    public String getU_age() {
        return u_age;
    }

    public void setU_age(String u_age) {
        this.u_age = u_age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "u_name='" + u_name + '\'' +
                ", u_age='" + u_age + '\'' +
                '}';
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值