目录
SpringMVC参数获取_使用Servlet原生对象获取参数
SpringMVC参数获取_自定义参数类型转换器
SpringMVC参数获取_编码过滤器
SpringMVC处理响应_配置视图解析器
SpringMVC处理响应_控制器方法的返回值
SpringMVC处理响应_request域设置数据
SpringMVC处理响应_session域设置数据
SpringMVC参数获取_使用Servlet原生对象获取参数
SpringMVC也支持使用Servlet原生对象,在方法参数中定义 HttpServletRequest 、 HttpServletResponse 、 HttpSession 等类型的参数即可直接在 方法中使用。
// 使用Servlet原生对象 @RequestMapping("/c1/param8") public void servletParam(HttpServletRequest request, HttpServletResponse response, HttpSession session){ // 原生对象获取参数 System.out.println(request.getParameter("name")); System.out.println(response.getCharacterEncoding()); System.out.println(session.getId()); }
访问该方法即可:http://localhost:8080/c1/param8?name=bjwan
一般情况下,在SpringMVC中都有对Servlet原生对象的方法的 替代,推荐使用SpringMVC的方式代替Servlet原生对象。
SpringMVC参数获取_自定义参数类型转换器
前端传来的参数全部为字符串类型,SpringMVC使用自带的转换器 将字符串参数转为需要的类型。如:
// 获取简单类型参数
@RequestMapping("/c1/param1")
public void simpleParam(String username,int age){
System.out.println(username);
System.out.println(age);
}
请求路径:http://localhost:8080/c1/param1?username=bz&age =10
但在某些情况下,无法将字符串转为需要的类型,如:
@RequestMapping("/c1/param9")
public void dateParam(Date birthday){
System.out.println(birthday);
}
由于日期数据有很多种格式,SpringMVC没办法把所有格式的字符 串转换成日期类型。比如参数格式为 birthday=2025-01-01 时,SpringMVC 就无法解析参数。此时需要自定义参数类型转换器。
1、定义类型转换器类,实现Converter接口
// 类型转换器必须实现Converter接口,两个泛型代表转换前的类型,转换后的类型 public class DateConverter implements Converter<String, Date> { /** * 转换方法 * @param source 转换前的数据 * @return 转换后的数据 */ @Override public Date convert(String source) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = sdf.parse(source); } catch (ParseException e) { e.printStackTrace(); } return date; } }
2、注册类型转换器对象
<!-- 配置转换器工厂 --> <bean id="dateConverter" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!-- 转换器集合 --> <property name="converters"> <set> <!-- 自定义转换器 --> <bean class="com.tong.converter.DateConverter"></bean> </set> </property> </bean <!-- 使用转换器工厂 --> <mvc:annotation-driven conversionservice="converterFactory"> </mvc:annotation-driven>
3、此时再访问http://localhost:8080/c1/param9?birthday=2025- 01-01时,SpringMVC即可将请求参数封装为Date类型的参数。
SpringMVC参数获取_编码过滤器
在传递参数时,tomcat8以上能处理get请求的中文乱码,但不能处 理post请求的中文乱码
1、编写jsp表单
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>编码过滤器</title> </head> <body> <form action="/cn/code" method="post"> 姓名:<input name="username"> <input type="submit"> </form> </body> </html>
2、编写控制器方法
@RequestMapping("/cn/code") public void code(String username){ System.out.println(username); }
SpringMVC提供了处理中文乱码的过滤器,在web.xml中配置该过 滤器即可解决中文乱码问题:
<!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->
<filter>
<filter-name>encFilter</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>encFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SpringMVC处理响应_配置视图解析器
SpringMVC默认情况下会在控制器执行完成后跳转到视图页面,视 图解析器能找到相应的视图,之前的404异常就是由于没有配置视 图解析器导致找不到视图。
在SpringMVC中提供了13个视图解析器,用于支持不同的视图技术。InternalResourceViewResolver是SpringMVC的默认视图解析 器,用来解析JSP视图。
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/" />
<!-- 视图后缀 -->
<property name="suffix" value=".jsp" />
</bean>
SpringMVC处理响应_控制器方法的返回值
我们可以通过控制器方法的返回值设置跳转的视图,控制器方法支 持以下返回值类型:
返回值为void
此时会跳转到名字是 前缀+方法路径名+后缀 的jsp页面
1、编写控制器方法
// 路径是helloMVC,方法执行完后会跳转到/helloMVC.jsp @RequestMapping("/helloMVC") public void helloMVC(){ System.out.println("hello SpringMVC!"); }
2、编写helloMVC.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>MVC</title> </head> <body> <h1>欢迎来到SpringMVC</h1> </body> </html>
返回值为String
此时会跳转到名字是 前缀+返回值+后缀 的jsp页面
编写控制器方法
// 返回值为String
@RequestMapping("/c2/hello1")
public String helloMVC1(){
System.out.println("hello SpringMVC!");
// 方法执行完后会跳转到/helloMVC.jsp
return "helloMVC";
}
返回值为ModelAndView
这是SpringMVC提供的对象,该对象可以向request域设置数据并 指定跳转的页面。该对象中包含Model对象和View对象。
1、Model:向request域中设置数据。
2、View:指定跳转的页面。
1、编写控制器方法
// 返回值为ModelAndView @RequestMapping("/c2/hello2") public ModelAndView useMAV(){ System.out.println("返回值类型为ModelAndView"); // 1.创建ModelAndView对象 ModelAndView modelAndView = new ModelAndView(); // 2.获取Model对象,本质是一个Map Map<String, Object> model = modelAndView.getModel(); // 3.使用Model对象向request域设置数据 model.put("name","程序员"); // 4.使用View对象设置跳转的路径为/tong.jsp modelAndView.setViewName("baizhan"); return modelAndView; }
2、编写jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <head> <title>百千万</title> </head> <body> <h1>你好!${requestScope.name}</h1> </body> </html>
3、修改web.xml命名空间,让jsp页面默认支持el表达式
<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/webapp_3_1.xsd" version="3.1"> </web-app>
SpringMVC处理响应_request域设置数据
当控制器返回值为ModelAndView时我们可以向request域设置数 据,我们还有以下方法可以向request域设置数据:
使用原生的HttpServletRequest
@RequestMapping("/c2/hello3")
public String setRequestModel(HttpServletRequest request){
request.setAttribute("username","面涂学堂");
return "baizhan";
}
使用Model、ModelMap
SpringMVC提供了Model接口和ModelMap类,控制器方法添加这 两个类型的参数,使用该参数设置数据,该数据就会存到request域中。
@RequestMapping("/c2/hello4")
public String setRequestModel2(Model model, ModelMap modelMap){
// 使用Model将数据存入request域
// model.addAttribute("username","辛苦学堂");
// 使用ModelMap将数据存入request域
modelMap.addAttribute("username","辛苦学堂");
return "baizhan";
}
使用Map集合
Model接口底层就是一个Map集合,我们可以给控制器方法设置 Map类型的参数,向Map中添加键值对,数据也会存到request域 中。
@RequestMapping("/c2/hello5")
public String setRequestModel3(Map map){
map.put("username","辛苦学堂");
return "baizhan";
}
SpringMVC处理响应_session域设置数据
Session作用域表示在当前会话中有效。在SpringMVC中对于
Session作用域传值,只能使用HttpSession对象来实现。
1、编写控制器方法
@RequestMapping("/c2/hello6") public String setSeesionModel(HttpSession session){ session.setAttribute("address","北京"); return "baizhan"; }
2、编写jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java"%> <html> <head> <title>百战不败</title> </head> <body> <h1>你好!${requestScope.name}</h1> <h1>地址是!${sessionScope.address}</h1> </body> </html>