Spring MVC实战指南:构建高效Web应用的架构与技巧(二)
自定义类型转换器(2种方式)
注解
Date类型 :Date birthday,数据输入的默认形式为2024/02/01,用.或者-都不行。
通过以下方式来改变:日期的写入形式
实体类中: @DateTimeFormat(pattern="yy-MM-dd HH:ss:mm")
配置文件(springmvc文件)中:让映射器生效
绑定格式后必须按格式写,默认的格式就不能使用了。
实现converter的接口
将spring转换成Date
* 自定义类型转换器 把String转换成Date
*/
public class StringToDate implements Converter<String,Date>{
/**
* 进行类型转换的方法
* @param s 用户输入的内容
* @return
*/
@Override
public Date convert(String s) {
// 判断
if(s == null){
throw new RuntimeException("请输入内容");
}
// 进行转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
// 进行转换
return sdf.parse(s);
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
2.注册自定义类型转换器,在springmvc.xml文件中编写配置
<!--配置日期类型转换器,类型转换器的组件,把日期类型转换注入到组件对象中-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.qcbyjy.demo2.StringToDate" />
</set>
</property>
</bean>
<!--让映射器生效(默认不配置也是可以的)-->
<mvc:annotation-driven conversion-service="conversionService"/>
在控制器中使用原生的ServletAPI对象
只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象
/** * 原生的API
* @return
*/
@RequestMapping("/save6.do")
public String save6(HttpServletRequest request, HttpServletResponse response){
System.out.println(request); // 获取到HttpSession对象
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(response);
return "suc";
}
常用注解(5个)
@controller、@rescontroller
RequestParam注解
- 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
- 属性:
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供
defaultValue:defaultValue = "abc"
如果不要求必须传请求参数,使用默认值defaultValue;如果要求必须传参数,就不用使用defaultValue
如果必须传值,就不用设置
- 代码:
/**
* RequestParam注解
* required = false ,默认值是true,必须要传请求参数,不传就会报错
* defaultValue = "abc" 如果没有传请求参数,使用默认值
* @return
*/
@RequestMapping("/save1.do")
public String save(@RequestParam(value = "username",required = false,defaultValue = "abc") String name){
System.out.println("姓名:"+name);
return "suc";
}
前端使用的是username。required默认值是true,一旦使用了RequestParam,这个方法的参数就必须赋值。
RequestBody注解
- 作用:用于获取请求体的内容(注意:get方法不可以),一般用于post请求
- 属性:
required:是否必须有请求体,默认值是true
- 代码:
@RequestMapping("/save2.do")
public String save2(@RequestBody String body){
System.out.println("请求体内容:"+body);
return "suc";
}
获取整个表单的数据:
如username=asdfghj,前端页面是一个username的输入框
PathVaribale注解
- 作用:拥有绑定url中的占位符的。例如:url中有/delete/{id},{id}就是占位符
- 属性:
value:指定url中的占位符名称
Restful风格的URL
请求路径一样,可以根据不同的请求方式去执行后台的不同方法
result风格的URL优点:结构清晰、符合标准、易于理解、扩展方便
- 代码:
@RequestMapping(path = "/emp/{id}",method = RequestMethod.GET)
public String findById(@PathVariable(value = "id") Integer id){
System.out.println("通过id查询员工..."+id);
return "suc";
}
以下这两种写法是一致的:
浏览器上的输入地址的形式
- 修改前端控制器的配置文件
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载springmvc.xml配置文件,配置的是Spring配置-->
<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>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
RequestHeader注解
- 作用:获取指定请求头的值
- 属性:value:请求头的名称
- 代码:
/**
* RequestHeader 获取请求头的值
* @return
*/
@RequestMapping("/save3.do")
public String save3(@RequestHeader(value = "Accept") String header){
System.out.println("Accept请求头的值:"+header);
return "suc";
}
CookieValue注解
- 作用:用于获取指定cookie的名称的值
- 属性:value:cookie的名称
- 代码:
/**
* CookieValue 获取到cookie中的值
* @return
*/
@RequestMapping("/save4.do")
public String save4(@CookieValue(value = "JSESSIONID") String cookie){
System.out.println("值:"+cookie);
return "suc";
}