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
看看
请求中所携带的请求参数
-
逐个参数
要求:控制器方法的形参名必须和请求中参数名一致,以为要对应进行赋值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
实现步骤:
- 在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输出中文结果页面
条条:该学习笔记是记录了我的学习过程,学习自动力节点,有不对的地方欢迎指出