java基础-day55-SpringMVC-01

springmvc

1.RequestMapping详解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上
作用在类上:第一级的访问目录
作用在方法上:第二级的访问目录

注意:/ 表示应用的根目录开始,路径上不能写 /

RequestMapping的属性
path: 指定请求路径的url
value: value属性和path属性是一样的
mthod: 指定该方法的请求方式
params: 指定限制请求参数的条件
headers: 发送的请求中必须包含的请求头

2.请求参数的绑定

绑定机制:
表单提交的数据都是k=v格式的 username=jack&password=123
SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
要求:提交表单的name和参数的名称是相同的

支持的数据类型
基本数据类型和字符串类型
实体类型(JavaBean)
集合数据类型(List、map集合等)

基本数据类型和字符串类型
提交表单的name和参数的名称是相同的,区分大小写

实体类型(JavaBean)
要求提交表单的name和JavaBean中的属性名称需要一致
如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性

给集合属性数据封装
list[index].属性名
map['key'].属性名

注意:如果请求参数是中文,可以在web.xml中配置Spring提供的字符集过滤器来解决中文乱码问题

如果对象的属性中有Date类型,页面输入参数格式是 2019/1/1 可以自动参数绑定,如果页面输入参数格式是 2019-1-1 则无法绑定,需要使用自定义类型转换器来解决.

表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。
如果想自定义数据类型转换,可以实现Converter的接口

1. 创建日期转换类

//把字符串转换日期
public class StringToDateConverter implements Converter<String,Date>{
    public Date convert(String source) {
        // 判断
        if(source == null){
            throw new RuntimeException("请您传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        try {
            // 把字符串转换日期
            return df.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}


2.修改springmvc.xml

<!--配置自定义类型转换器-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.qf.utils.StringToDateConverter"/>
            </set>
        </property>
    </bean>


    <!-- 开启SpringMVC框架注解的支持 -->
    <mvc:annotation-driven conversion-service="conversionService"/>

3.常用注解

RequestParam注解
作用:把请求中的指定名称的参数传递给控制器中的形参赋值
属性
value:请求参数中的名称
required:请求参数中是否必须提供此参数,默认值是true,必须提供

PathVariable注解
作用:拥有绑定url中的占位符的。url中有/delete/{id},{id}就是占位符
属性
value:指定url中的占位符名称

例如:
jsp:
    <a href="user/testPathVariable/10">testPathVariable</a>

controller:
    @RequestMapping(value="/testPathVariable/{uid}")
    public String testPathVariable(@PathVariable(name="uid") String id){
        System.out.println(id);
        return "success";
    }

Restful风格的URL
请求路径一样,可以根据不同的请求方式去执行后台的不同方法
restful风格的URL优点
结构清晰
符合标准
易于理解
扩展方便

4.不常用注解

RequestHeader注解
作用:获取指定请求头的值
属性
value:请求头的名称

例如:
jsp:
    <a href="user/testRequestHeader">RequestHeader</a>

controller:
    @RequestMapping(value="/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value="Accept") String header){
        System.out.println(header);
        return "success";
    }
    
CookieValue注解
作用:用于获取指定cookie的名称的值
属性
value:cookie的名称

例如:
jsp:
    <a href="user/testCookieValue">CookieValue</a>

controller:
    @RequestMapping(value="/testCookieValue")
    public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
        System.out.println(cookieValue);
        return "success";
    }

5.响应数据和结果视图

返回值分类

返回字符串:String
Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址。
应用时可以设置参数类型为Model,使用Model对象调用addAttribute方法来存储数据。

返回值是void
如果控制器的方法返回值编写成void,执行程序报404的异常,默认查找JSP页面没有找到。
应用时可以设置参数类型为HttpServletRequest和HttpServletResponse,使用转发或者重定向来跳转页面

返回值是ModelAndView对象
ModelAndView对象是Spring提供的一个对象,可以调用addObject方法来保存数据以及调用setViewName方法来跳转页面.

使用forward关键字进行请求转发
return "forward:转发的JSP路径"

使用redirect关键字进行重定向(默认会把项目路径加上)
return "redirect:重定向的JSP路径"

6.springmvc中ajax的使用

@RequestBody和@ResponseBody一般用于ajax中获取请求json类型的数据和返回响应json类型的数据

@RequestBody :用于获取请求体json的数据(注意:GET方式请求不可以)
ajax中设置请求参数为json类型:contentType :application/json

@ResponseBody:用于响应json数据
前提是需要提前导入json的jar包依赖

1.DispatcherServlet会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而
不能被使用。解决问题就是需要配置静态资源不进行拦截,在springmvc.xml配置文件添加如下配置:
    
<!--前端控制器,哪些静态资源不拦截(springmvc.xml中)-->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<!-- 设置html静态页面不拦截(web.xml中) -->
 <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.html</url-pattern>
 </servlet-mapping>
  
  
<!-- 设置所有静态资源不被拦截(springmvc.xml中),等同于上面的两个配置-->
<mvc:default-servlet-handler/>

2. 在pom.xml中导入依赖

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    
3.编写html/jsp页面

<script type="application/javascript" src="js/jquery-1.8.3.js"></script>

<body>
      <input type="button" value="发送ajax请求" id="btn">
</body>

<script type="application/javascript">

    $(function () {
        $("#btn").click(function () {

            //测试@RequestBody
            $.ajax({
                type: "POST",
                url: "testRequestBody",
                contentType: "application/json;charset=UTF-8",
                data: '{"id":"1001","name":"marry","password":"123"}',
                //backData,status,xmlHttpRequest
                success: function(backData,status,xmlHttpRequest){
                    alert( "id: " + backData.id );
                    alert( "name: " + backData.name );
                    alert( "password: " + backData.password );
                },
                error:function () {
                    alert("ajax报错...")
                }
            });

        })
    })

</script>
    
4.在Controller中添加方法

    @RequestMapping("testRequestBody")
    @ResponseBody
    public User testRequestBody(@RequestBody User user){

        System.out.println("--testRequestBody--");

        System.out.println(user);

        user.setId("1002");
        user.setName("tom");
        user.setPassword("789");

        return user;
    }
Json介绍1.常用的Json框架:Jackson  FastJson  Gson   JavaBean序列化转换为Json格式,性能:Jackson > FastJson > Gson > Json-lib2.Jackson常用注解    @JsonIgnore : 指定属性不返回    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8") : 格式指定日期属性    @JsonProperty("别名") : 给属性指定别名
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容