一、controller接收的参数为日期类型
日期类型不能直接传参,使用下面两种方法可以传入Date类型的参数
1.在controller类中添加以下方法
@InitBinder public void initBinder(ServletRequestDataBinder binder){ //只要网页中传来的数据格式为yyyy-MM-dd HH:mm:ss 就会转化为Date类型 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), true)); }
2.在实体类中的日期属性上加注解
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date taketime;
二、controller进行数据保存
- 使用ModelAndView,那么该方法的返回类型必须是ModelAndView
- 使用Model返回类型为String
- 使用Map,返回类型为String
- 原始的HttpServletRequest对象保存
以上四种数据均保存在request域
数据保存到session域的方式
1.使用原始的HttpSession保存,可以直接通过参数获取session对象
2.使用注解@SessionAttributes(name={key1,key2}) ,该注解用在controller类上方,其中的key值在作为保存的数据名时会默认保存到session域中
3.application域无法通过参数直接获取,可以通过获取session再调用session.getServletContext()获取
三、静态资源的映射关系
web.xml配置spirngmvc信息时
<servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
访问后缀为.do的资源会进入dispatcherservlet,其他地址不受影响
如果这样配置
<url-pattern>/</url-pattern>
所有资源都要经过dispatcherservlet,一个img标签的src也是,由于没有相应的controller,资源将无法通过。静态资源都无法正常显示
解决方法:在springMVC配置文件中添加
<!-- 。释放静态资源 --> <mvc:default-servlet-handler/>
四、springMVC完成ajax功能
1.ajax传递字符串
一个demo,js文件中
<script type="text/javascript"> $.get("./ajax1.do",{name:"乱码"},function(result){ alert(result); }) </script>
相应的controller中
@RequestMapping(value="ajax1.do",produces = "text/html;charset=UTF-8")//解决乱码问题 @ResponseBody //将结果作为内容返回 public String ajax1(String name) { System.out.println(name); return name+"返回成功"; }
加上注解@ResponseBody ,表示将结果作为内容返回,相当于out.print()。但是中文会出现乱码,设置相应编码的过滤器无效。解决方法其一是上面代码,设置注解RequestMapping的produces可将ContentType设为utf-8。不过使用ajax传递json数据时却没有此问题,其根本原因在源码中探究
开启注解驱动时会访问spring的jar包webmvc包->config-> AnnotationDrivenBeanDefinitionParser类,查看其中的getMessageConverters方法,可以看到其中的stringConverterDef,
if (convertersElement == null || Boolean.valueOf(convertersElement.getAttribute("register-defaults"))) { messageConverters.setSource(source); messageConverters.add(createConverterDefinition(ByteArrayHttpMessageConverter.class, source)); RootBeanDefinition stringConverterDef = createConverterDefinition(StringHttpMessageConverter.class, source); stringConverterDef.getPropertyValues().add("writeAcceptCharset", false); messageConverters.add(stringConverterDef);
与下面几项相比较,可以发现这是用于字符串信息转化的配置,选择构造方法的StringHttpMessageConverter查看
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); private final Charset defaultCharset;
可以看到其默认的字符编码是ISO,下面有默认编码属性,而该类的含参的构造函数,参数就为defaultCharset
public StringHttpMessageConverter(Charset defaultCharset) { super(new MediaType("text", "plain", defaultCharset), MediaType.ALL); this.defaultCharset = defaultCharset; this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values()); }
改变此参数,就可以改变字符串信息转化的编码。在spring配置中,设置该类的构造方法参数初始值
<context:component-scan base-package="com.zhiyou100.cyf.controller"/> <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg index="0" value="utf-8"></constructor-arg> </bean> </mvc:message-converters> </mvc:annotation-driven>
另外,查看一下json格式信息转化配置,点进MappingJackson2
RootBeanDefinition jacksonConverterDef = createConverterDefinition(MappingJackson2HttpMessageConverter.class, source);
其含参构造方法
public MappingJackson2HttpMessageConverter(ObjectMapper objectMapper) { super(objectMapper, new MediaType("application", "json", DEFAULT_CHARSET), new MediaType("application", "*+json", DEFAULT_CHARSET));
查看DEFAULT_CHARSET,可以发现这是抽象父类的属性,编码默认为utf-8
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
想要更改json的转化编码暂时未知
2.ajax传递json对象
1)加入jackson的jar包. springmvc,有三个
2)在相应的方法上加上@ResponseBody:将java对象转化为json对象,暂时不可传递含Date类型的对象
@RequestMapping("ajax2.do") @ResponseBody //。把java对象转化为json对象 public User ajax2(String name) { User user=new User("晃晃",11); return user; }
上面传递字符串时提到,json格式转化默认为utf-8类型
3.ajax传递集合
@RequestMapping("ajax3.do") @ResponseBody //。将结果作为内容返回 public List<User> ajax3() { User u1=new User("晃晃",11); User u2=new User("恩爱",12); User u3=new User("羁绊",1); List<User> list=new ArrayList<>(); list.add(u1);list.add(u2);list.add(u3); return list; }