springMVC日记(二)

一、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进行数据保存

  1. 使用ModelAndView,那么该方法的返回类型必须是ModelAndView
  2. 使用Model返回类型为String
  3. 使用Map,返回类型为String
  4. 原始的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)加入jacksonjar. 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;
    }