springMVC2

请求与响应

参数绑定

可以被注入的类型: HttpServletRequest, HttpServletResponse, HttpSession, Principal, Locale, InputStream, Reader, OutputStream, Writer, String, StringBuffer, Pojo, Date, List, Map, Array, Model, ModelMap等等

转换服务

转换服务为参数绑定时,处理数据类型的转换。

DefaultConversionService:默认的类型转换服务实现

DefaultFormattingConversionService:带数据格式化支持的类型转换服务实现,一般使用该服务实现即可。

springmvc在开启注解驱动,注册了很多Converter的实现类,但是如果不能满足需求,可以自定义转换器。具体如下:

//实现Converter接口
public class MyDateConverter implements Converter<String, Date>{

    //重写convert方法
    @Override
    public Date convert(String str) {
        SimpleDateFormat sdf;
        Pattern pattern1=Pattern.compile("^\\d{4}年\\d{1,2}月\\d{1,2}日$");
        Pattern pattern2=Pattern.compile("^\\d{1,2}-\\d{1,2}-\\d{4}$");
        try {
            if(pattern1.matcher(str).matches()){
                 sdf=new SimpleDateFormat("yyyy年MM月dd日");
                 return sdf.parse(str);
            }
            if(pattern2.matcher(str).matches()){
                 sdf=new SimpleDateFormat("MM-dd-yyyy");
                 return sdf.parse(str);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }   
        return null;
    }
}

将自定义的转换器添加到springmvc转换服务中

    <mvc:annotation-driven conversion-service="conversionService"/>

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.hemi.controller.converter.MyDateConverter"/>   
            </list>
        </property>
    </bean>

注意:
1、如果是单纯的日期格式转换可以使用@DateTimeFormat来实现

    @DateTimeFormat(pattern="yyyy年MM月dd日")
    private Date date;  

2、上面的转换只能处理url参数和请求体参数,如果是json中的日期格式转换,请使用@JsonFormat注解,请看下面的json部分。

json

1、json数据发送

后台:

1、@RequestBody

2、jackson的3个jar包

    @RequestMapping("jsonToBean")
    @ResponseBody
    public User jsonToBean(@RequestBody User user){
        return user;
    }

前台:

1、contentType:appliation/json;charset=utf-8

2、JSON.stringify(json),

    var json={username:"lisi",password:"123"};//定义json对象

    $(function(){
        $("#btn").click(function(){
            $.ajax({
                url:"/springmvc/jsonToBean",
                type:"post",
                contentType:"application/json;charset=utf-8",
                //js原生的一个将json对象转成json字符串的工具类           
                data:JSON.stringify(json),
                dataType:"text",
                success:function(data){
                    $("#content").html(data);
                }
            });
        });
    });

2、解决json日期格式化问题

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date date;

3、解决json写入@ResponseBody后出现中文乱码的问题

    <mvc:message-converters>
        <bean class="org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes">
                <list>
                    <value>application/json;charset=UTF-8</value>
                </list>
            </property>
        </bean>         
    </mvc:message-converters>

视图与模型

视图

springmvc.xml配置

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    //返回的字符串就是视图名称,提前是在springmvc.xml中配置了后缀名
    @RequestMapping("view1")
    public String view1(){
        return "formString";
    }
    //如果返回返回值,那么默认视图名为请求地址(约定优于配置原则)
    @RequestMapping("formString")
    public void view2(){}

数据模型

    //Model的本质就是map集合,视图解析器会将Model中的数据放到request域对象中

    //原始的写法,使用ModelAndView
    @RequestMapping("model1")
    public ModelAndView model1(){
        ModelAndView mav=new ModelAndView();
        mav.addObject("user", new User("lisi","123"));
        mav.setViewName("model1");//如果这句不写,那么使用约定的视图名
        return mav;
    }
    //简化了上面的写法
    @RequestMapping("model2")
    public String model2(Model model){
        model.addAttribute("username",  new User("lisi","123"));
        return "model1";
    }
    //再简化了上面的写法,如果没有返回视图名,那么默认使用请求地址作为视图名
    @RequestMapping("model3")
    public void model3(Model model){
        model.addAttribute("user",  new User("lisi","123"));
    }

    //------------------综合--------------------
    @RequestMapping("model4")
    public void model4(Model model,User user){
        //将user添加到Model中
        model.addAttribute("user", user);
    }
    //简化上面的写法
    @RequestMapping("model5")
    public void model5(@ModelAttribute User user){//直接将参数绑定好后的user添加到Model中
    }   
    @ModelAttribute("user")
    //将返回值暴露为模型数据,因为没有@RequestMapping注解,所以该方法不是处理器,它在每个处理器之前执行
    public User getUser(){
        return new User("zhangsan", "123");
    }

文件上传下载

文件上传

1、基本步骤

1、handler参数添加@RequestParam MultipartFile multipart

@RequestParam(name="user_photo",required=false) MultipartFile multipart

2、调用MultipartFile的transforTo(file)的方法,将文件写入到本地

3、springmvc.xml文件配制CommonsMultipartResolver视图

4、配置静态资源文件访问路径

方式一:

<mvc:resources location="/statics/" mapping="/statics/**"></mvc:resources>

方式二:使用servlet容器默认的DefaultServlet

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>

方式三:原理与方式二一致

<mvc:default-servlet-handler />

5、上传文件的jsp

1.png

2、注意问题

一、配置静态资源文件访问路径

如果不配置,会出现404异常

二、上传文件的路径

String path = req.getServletContext().getRealPath("statics" + File.separator + "uploadfile");

如果项目没有发布到tomcat服务器中,那么默认是在eclipse的对应项目目录中,这样导致图片找不到路径

解决方法:

1、将项目发布到tomcat,但是每次重新加载项目或者重启服务器就会删除已上传的文件

2、上传到一个统一的文件夹,项目引用该文件夹下的文件,这样不会被迫删除已有文件

<Context path="/statics" docBase="E:/download" reloadable="true" crossContext="true" />
<param-name>listings</param-name>
<param-value>true</param-value>

3、上传到其他http服务器上,例如nginx服务器,推荐!

文件下载

resp.setContentType("application/force-download");
resp.addHeader("Content-Disposition", "attachment;filename=" + filename);
byte[] byteArray = FileUtils.readFileToByteArray(file);
resp.getOutputStream().write(byteArray);

拦截器

自定义拦截器,实现HandlerInterceptor接口,并重写三个方法

public class MyInterceptor implements HandlerInterceptor {
    preHandle(){}//执行Handler之前,返回true,则继续进行,返回false则中断请求
    postHandle(){}//执行Handler时
    afterCompletion(){}//执行Handler之后
}

将自定义拦截器,添加到springmvc的拦截体系中

    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截器的请求-->
            <mvc:mapping path="/**"/>
            <!--放行的请求,即公开的地址-->
            <mvc:exclude-mapping path="/login/**"/>
            <bean class="com.hemi.interceptor.MyInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • 本文以两张图片开始: 看完了之后有么有觉得第一张的布娃娃和玩具总动员中的胡迪更友好呢?(如果你觉得伏地魔更友好,那...
    Bearoaroar阅读 2,453评论 0 3
  • 关键词:共享经济; 现在的农村,基本都是老幼留守地。像我爸这种五十出头的,在老家算是壮丁了。每逢赶集那天,他都会骑...
    徐君兰阅读 251评论 0 0