• 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;
        }
  • 相关阅读:
    精彩的“利益均衡”,尤其是“四”
    用搭积木的方式开发
    从公司层面看信息管理中的问题
    广义信息结构
    Cephfs创建及挂载
    对各类术语表进行记录
    weixin报警脚本
    shell 实现mysql写入操作
    python生成图片
    python实现路由追踪,并生成追踪图片
  • 原文地址:https://www.cnblogs.com/psxfd4/p/11456113.html
Copyright © 2020-2023  润新知