SpringMVC学习笔记3——关于参数

本文介绍了SpringMVC中如何处理参数,包括视图解析器的配置、类级别的@RequestMapping注解、请求方式的指定,以及处理器方法的参数类型,如HttpServletRequest、HttpServletResponse、HttpSession和请求参数。此外,还讨论了请求参数的接收方式,如通过request对象获取,以及处理中文乱码问题的过滤器设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.1 参数

前面我们通过some.do超链接跳转到show.jsp,但是如果我们直接在网址栏后加上/show.jsp也可以访问,只是这个页面没有通过控制器,里面的数据没有显示出来,如果我们不想让用户通过这种方法来访问,一种方法是把目标jsp放到WEB-INF下,这个目录下的资源用户是无法访问的,放完后,我们只需把controller中的setViewName()改成相应目录即可,如mv.setViewName("/WEB-INF/some.do"),但是如果这种操作很多,那就有很多"/WEB-INF/"需要我们去写;那这种重复性的工作,框架会帮我们去做,这里就用到了视图解析器

视图解析器
在spring配置文件中声明视图解析器
    <!--声明视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀:视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!--后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>
改setViewName方法

mv.setViewName("show");


类上加@RequestMapping

项目中我们方法上的@RequestMapping的请求前可能有个模块
如图

当这种方法多时,我们可以在类上加@RequestMapping,其中的value值是所有请求的公共部分,也叫模块名称

这样我们一看到类上有@RequestMapping("/user"),我们就知道这个类下的方法都是同一个模块的了
请求方式

我们可以给对于方法指定请求方式,这里我们还是要用到@RequestMapping注解,使用它的method属性;method表示请求反射光hi,它的值RequestMethod类是枚举值,当我们要指定get请求时使用RequestMethod.GET,post则为RequestMethod.POST

controller类中
@Controller
@RequestMapping("/user")
public class Mycontroller {

    @RequestMapping(value = "/some.do" , method = RequestMethod.GET)
    public ModelAndView doSome(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc进行web开发");
        mv.addObject("fun","执行doSome方法");
        mv.setViewName("show");
        return mv;
    }

    @RequestMapping(value = "/other.do" ,method = RequestMethod.POST)
    public ModelAndView doOther(){
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","欢迎使用springmvc进行web开发");
        mv.addObject("fun","执行doOther方法");
        mv.setViewName("other");
        return mv;
    }
}
index.jsp
<body>
        <p>第一个springmvc程序</p>
        <p><a href="user/some.do"/>get发起some.do请求</p>
        <br>
        <form action="user/other.do" method="post">
            <input type="submit" value="post发起other.do请求">
        </form>
</body>
index.jsp中如果some和other交换,点击后会显示405
处理器方法的参数

请求中很多时候会包含参数,我们可以通过设置控制器方法的参数来接收用户传递过来的参数;处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序
员可在方法内直接使用

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • 请求中所携带的请求参数

这些直接在控制器方法形参位置声明就好了

然后我们可以试验一下是否能接收参数,我们在mv.addObject中加入request.getParameter("name"),然后重启一下服务器,然后在地址栏最后加上?name=tt看看
成功!

请求中所携带的请求参数
  1. 逐个参数
    要求:控制器方法的形参名必须和请求中参数名一致,以为要对应进行赋值

    index.jsp
    <body>
        <p>提交参数给controller</p>
    
        <form action="receiveparam.do" method="post">
            姓名:<input type="text" name="name">
            年龄:<input type="text" name="age">
            <input type="submit" value="提交参数">
        </form>
    
    </body>
    
    Controller类
    @RequestMapping(value = "/receiveparam.do" )
    public ModelAndView doSome(String name,int age){
        ModelAndView mv=new ModelAndView();
        mv.addObject("myname",name);
        mv.addObject("myage",age);
        mv.setViewName("show");
        return mv;
    }
    

    记得show.jsp也要改,这里就不写上来了

    结果

    成功

    那框架是如何接收请求参数的?

    1.使用request对象接收参数:
    String strName=request.getParameter(“name”);
    Stirng strAge=request.getParameter("age);
    2.springmvc框架通过DispatcherServlet调用MyController的doSome(),调用方法时,按名称对应,把接收的参数赋值给形参,doSome(strName,Integer.valueOf(strAge)),框架会提供类型转换功能,能把String转为int,long,float,double等类型

    但是当不输入年龄,或在年龄输入非法内容时,就会报400错误(客户端错误,一般指参数传递有错误)了;我们可以把形参的int类型换成包装类Integer,这样不输入年龄时,可以接收null;

    关于中文乱码

    在项目中,如果是get方法,如果我们在姓名写入中文,可以正常显示,但是如果是post方法的话,就会显示乱码;为此,我们要用过滤器来解决这个乱码问题,过滤器可以自定义,也可以使用框架提供的过滤器CharacterEncodingFilter

    实现步骤:
    1. 在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>
        <!--强制request使用字符集encoding-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--强制response使用字符集encoding-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <!--
        /*表示所有请求强制先通过过滤器
    -->
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    post输出中文结果页面

    成功显示中文

条条:该学习笔记是记录了我的学习过程,学习自动力节点,有不对的地方欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值