注解属性
value
@RequestMapping(value={"/test02.action","/test002.action","/test002*.action"})
指定要将当前处理器绑定到哪个访问路径上,可以配置多个路径。
*通配符
@RequestMapping("/test01.action")
//只有一个属性时,value可以省略,括号可以省略
@RequestMapping(value={"/test01.action","/test01*.action"})
//支持*通配符
method
指定当前路径的请求方式,一定为哪种类型或不为哪种类型
@RequestMapping(value = "test02.action",
method = RequestMethod.POST,params = {"username","password=123"})
//params 必须要有哪个参数,且可指定参数值为多少,或一定不为多少
header
用来限定由指定的请求头才能访问
@RequestMapping(value="/test05.action",headers= {"host=localhost"})
params
用来限定当前请求中必须包含指定名称的请求参数才会被当前处理器处理通过params属性指定只处理请求参数符合指定要求的请求。
@RequestMapping(value="/test04.action",
params={"name","gender=male","!age","addr!=bj"})
获取请求参数
request获取方式
@RequestMapping("/m2test03.action")
public void test03(HttpServletRequest request)
throws UnsupportedEncodingException {
String name = request.getParameter("name");
String addr = request.getParameter("addr");
System.out.println(name+"..."+addr);
}
javabean获取方式
会将请求参数自动封装的bean中,前提是javabean中要有对应的set方法
@Controller
public class MyController02 {
@RequestMapping("/m2test01.action")
//若参数少,则哪个对应属性为初始化值 User{id=15, name='xty', age=21, gender='null'}
//若参数多,则多的参数不进行封装
//http://localhost/LX_LX02/m2test01.action?id=15&name=xty&age=21&gender=nan&dog.name=wc&dog.age=6
//User{id=15, name='xty', age=21, gender='nan', dog=Dog{age=6, name='wc'}}
//指定的属性为set属性
public void test01(User user){
System.out.println(user);
//直接将请求参数自动封装到user对象中
//return "MyController01";
}
直接获取请求参数
获取请求参数
public String test02(String name,String password,int age){
System.out.println("姓名:"+name+"、密码:"+password+"、年龄:"+age);
return "/test02";
}
多个同名请求参数,可用数组接受
@RequestMapping("/m2test02.action")
public void test02(String [] like){
System.out.println(Arrays.asList(like));
//[girl, papapawithgirl]
//http://localhost/LX_LX02/m2test02.actionlike=girl&like=papapawithgirl
//若没有参数则直接报错 java.lang.NullPointerException 空指针异常
}
若请求参数与我们要接受的参数名称不一致,可用@RequesstParam注解进行设置,@RequesstParam()内为请求参数名。
public String test02(@RequestParam("username") String 姓名,@RequestParam("password") String 密码,@RequestParam("age") int 年龄){
//String 姓名 返回的是null
//前面加上@RequestParam(“原本的参数名”)即可转换成对应的参数名称
System.out.println("姓名:"+姓名+"、密码:"+密码+"、年龄:"+年龄);
return "/test02";
}
复杂类型参数接受
如果自动封装的bean中存在复杂类型,只要该复杂类型的属性同样具有setXxx方法,则可以在请求参数中包含[bean中复杂类型].[属性]的方式为该复杂类型的参数复制,从而实现自动封装bean的过程中处理其中的复杂类型
http://localhost/LX_LX02/m2test01.action?id=15&name=xty&age=21&gender=nan&dog.name=wc&dog.age=6
拼接的参数
User{id=15, name=‘xty’, age=21, gender=‘nan’, dog=Dog{age=6, name=‘wc’}}
返回的效果
请求参数中的中文乱码问题
SpringMVC提供了过滤器用来解决中文乱码问题,但是只对post提交方式有效
日期类型参数处理
在SpringMVC中解析页面提交的请求参数时,无法自动获取封装日期到Data。
如果想要实现自动封装,必须手动注册适配器自己来指定转换方式。
@InitBinder
public void dayinit(ServletRequestDataBinder binder){
binder.registerCustomEditor(Date.class,
new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),
true));
}
@RequestMapping("/m2test04.action")
//字符串格式的日期
public void test04( String name, String birthday){
System.out.println(name+"..."+birthday);
//null...null
//许天一...2019-12-10
}
异常处理
为当前controller配置异常处理
配置单个类异常提示页面
在类中设置@ExceptionHandler修饰的方法即可
注:若某个类中有异常处理方法,则不再使用全局处理
注解方式配置异常处理
配置单独的类
@ControllerAdvice
public class MyException {
@ExceptionHandler
public String yc(Exception e){
System.out.println(e.getMessage());
return "yichang";
}
配置文件方式配置异常处理
<!--配置全局错误提示页面-->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="ExceptionMappings">
<props>
<prop key="java.lang.NullPointerException">null_err</prop>
</props>
</property>
</bean>