SpringMVC学习(三)–注解开发
标签(空格分隔): SpringMVC
与Struct2的不同
1、SpringMVC的入口是一个Servlet,而Struct2是一个Filter
2、SpringMVC是基于方法开发(一个url对应一个处理方法),请求参数通过形参映射。可以是单例也可以是多例。
struts2是基于类开发,传递参数是通过类的属性,只能是多例
3、struts采用值栈存储请求和相应数据,通过OGNL存取数据,spring mvc通过参数解析器将request请求内容解析并给方法的形参一一赋值。,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。
@RequestMapping
通过注解@RequestMapping。可以指定不同的得处理器映射规则
1、URL路径映射
@RequestMapping(value=”/item”)或@RequestMapping(“/item)value的值是数组,可以将多个url映射到同一个方法
2、窄化请求映射
在类上面使用@RequestMapping指定请求路径前缀,限定这个类所有的请求前缀
3、限定请求方法
3.1 限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported
3.2 限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过Post访问则报错:
HTTP Status 405 - Request method ‘GET’ not supported
3.3 GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
3.4 还有PUT 和 DELETE请求
@Controller
1、方法返回值
1.1 ModelView
controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view
1.2 Void
类似于Servlet,在形参中指定request和response。通过response设定返回的视图类型
1.3 返回字符串
返回字符串的时候指定的是逻辑视图名,经视图解析器解析成物理视图
1.4 重定向
//重定向到queryItem.action地址,request无法带过去
return "redirect:queryItem.action";
redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。
由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:
/item/queryItem?…&….
1.5 请求转发
//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";
forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到
参数绑定
默认支持的参数类型
遇到以下几种参数类型,会进行自动识别并赋值
1、HttpServletRequest
2、HttpServeltResponse
3、HttpSession
对于Cookie对象
springmvc有两种方式获取:(1)在控制器中通过注解@CookieValue(键值名),获取指定某个cookie。(2)通过HttpServletRequest中的getcookies方法获取cookie数组,然后迭代里面的每一个cookie键值对
简单数据类型的参数绑定
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定
当参数名和形参中的参数名不一致的时候,可以使用@RequestParam进行声明。
value指定参数名的名字,
required:指定该参数是否必须,默认为true。如果指定为true,但是没有传则会报:
HTTP Status 400 - Required Integer parameter ‘XXXX’ is not present
defaultValue指定默认值
pojo的参数绑定
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性
如果是包装pojo,即pojo中的某个属性对象下的属性映射,则参数的格式应该类似ognl的传至发,即属性对象.具体属性名
自定义参数绑定
根据业务需求自定义日期格式进行参数绑定
1、自定义Converter
public class CustomDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simpleDateFormat.parse(source);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
2、配置
<mvc:annotation-driven conversion-service="conversionService">
</mvc:annotation-driven>
<!-- conversionService -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<property name="converters">
<list>
<bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
</list>
</property>
</bean>
集合类参数绑定
1、数组
前端:
<input type="checkbox" name="item_id" value="001"/>
<input type="checkbox" name="item_id" value="002"/>
<input type="checkbox" name="item_id" value="002"/>
Controller:
public String deleteitem(String[] item_id)throws Exception{
System.out.println(item_id);
}
2、集合
List中存放对象,并将定义的List放在包装类中,action使用包装对象接收.根据包装类型的pojo进行参数传递
3、Map
在包装类中定义Map对象,并添加get/set方法,action使用包装对象接收
json数据交互
@RequestBody作用:
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
@ResponseBody作用:
该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
问题总结
404错误
1、根据处理器映射器找不到对应的处理器。报错为:
2、找不到对应的视图:
中文乱码
1、POST请求
修改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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、GET请求
2.1 修改Tomcat的默认编码与工程编码一致
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
2.2 对参数进行重新编码
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码