springmvc

今天内容安排

1:springmvc

2:整体架构介绍

3、hello world

4、注解

5、如何配置springmvc的访问路径

6、如何接受用户传递过滤的参数

7、json的处理

8、spring的拦截器

9、文件上传。

接收请求,接收参数,返回结果

 

  1. springMVC简介

 

高内聚,低耦合

可扩展性太差

反复迭代

  1. mvc回顾

 

 

  1. springmvc 整体架构

 

 

1、用户发起请求到控制器 DispatcherServlet(前端控制器)

2、前端控制器去handlerMapper查找Handler对象

3、HandlerMapper返回HandlerExecutorChain 执行链(包含两部分内容:Handler ,拦截器集合)

4、前端控制器,通过HandlerAdapter 适配器执行 Handler对象

5、Handler处理具体的业务逻辑

6、Handler处理完业务逻辑之后,返回ModelAndView 其中的View是视图名称

7、将ModelAndView返回前端控制器

8、前端控制器,通过ModelAndView 中的视图名称。在视图解析器中查找视图

9、返回真正的View 视图对象

10、渲染视图

11、返回用户响应

 

  1. 第一个springmvc的案例

    1. 创建一个maven工程

 

 

 

 

 

  1. 引入主pom

 

注意:如果引入之后项目中出现红叉,使用maven-updateProject

 

  1. 导入依赖

 

<!-- mvc的依赖 -->

        <dependency>

            <groupId>org.springframework</groupId>

            <artifactId>spring-webmvc</artifactId>

        </dependency>

        <!-- 日志依赖 -->

        <dependency>

            <groupId>org.slf4j</groupId>

            <artifactId>slf4j-log4j12</artifactId>

        </dependency>

 

        <!-- Jackson Json处理工具包 springmvc 处理json数据的 -->

        <dependency>

            <groupId>com.fasterxml.jackson.core</groupId>

            <artifactId>jackson-databind</artifactId>

        </dependency>

        <!-- jsp相关 -->

        <dependency>

                <groupId>jstl</groupId>

                <artifactId>jstl</artifactId>

            </dependency>

            <dependency>

                <groupId>javax.servlet</groupId>

                <artifactId>servlet-api</artifactId>

                <scope>provided</scope>

            </dependency>

            <dependency>

                <groupId>javax.servlet</groupId>

                <artifactId>jsp-api</artifactId>

                <scope>provided</scope>

            </dependency>

 

  1. 配置maven的tomcat插件

 

<build>    

     <plugins>

            <!-- 配置Tomcat插件 -->

            <plugin>

                <groupId>org.apache.tomcat.maven</groupId>

                <artifactId>tomcat7-maven-plugin </artifactId>

                <configuration>

<!--                 项目运行后使用的端口号 -->

                    <port>8080</port>

<!--                 项目访问路径 -->

                    <path>/</path>

                </configuration>

            </plugin>

        </plugins>

    </build>

 

  1. 编写配置文件

    1. web.xml

1、创建web.xml

 

2、配置web.xml中的内容

 

3、添加dispatcherServlet

 

  1. spring-mvc的配置

1、添加springmvc-servlet.xml

spring-mvc 会默认去WEB-INF的目录下。寻找${serlvet-name}-serlvet.xml的文件。

所以我们把serlvetmvc的配置文件添加到web-inf的目录下。并且名字与web.xml 中的servlet-name 相同

 

 

 

2、添加xml中的约束信息

 

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

    xmlns:context="http://www.springframework.org/schema/context"

    xmlns:mvc="http://www.springframework.org/schema/mvc"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

 

</beans>

 

3、配置HandlerMapping

 

 

 

4、配置handlerAdapter

 

 

 

 

5、自定义Handler(controller)

 

在springmvc-servlet.xml 总配置Handler

 

6、配置视图解析器

 

<!-- 配置视图解析器 -->

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<!--     前缀 -->

    <property name="prefix" value="/WEB-INF/views/"></property>

<!--     后缀 -->

    <property name="suffix" value=".jsp"></property>

</bean>

 

7、定义视图:

 

hello.jsp中的内容:

 

 

 

  1. 配置启动

     

    1. 测试

     

    1. 分析第一个案例的执行过程

     

    1. 精简之后的配置

     

     

    1. SpringMVC的默认配置是什么样的

     

    默认配置:org.springframework.web.servlet路径下的/org/springframework/web/servlet/DispatcherServlet.properties文件

     

    org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

     

    org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

     

    org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\

        org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

     

    org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\

        org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\

        org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

     

    org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\

        org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\

        org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

     

    org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

     

    org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

     

    org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager

     

    1. 第一个注解程序

    入门案例中的思考:

    1、每个类需要继承Controller,麻烦

    2、每个类只能处理一个业务逻辑,不能是controller处理多个业务逻辑。

     

    使用注解:解决上述两个问题;

     

    1. 创建一个hello2Controller类,加上注解

     

    1. 配置扫描器springmvc-servlet.xml里

    <!-- 配置扫描包,使用 @Controller注解生效 -->

    <context:component-scan base-package="cn.itcast.springmvc.controller"/>

     

    1. 测试

     

    http://localhost:8080/show1.do

     

     

    1. 使用推荐使用个的HandlerMapping和HandlerAdapter

    <!-- 推荐使用的RequestMappingHandlerAdapter -->

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>

    <!-- 推荐使用的RequestMappingHandlerMapping -->

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

     

    1. 使用注解驱动替换推荐的配置

    <!-- 配置注解驱动,会默认加载: RequestMappingHandlerAdapter RequestMappingHandlerMapping -->

    <mvc:annotation-driven/>

    1. 测试

    package cn.itcast.springmvc.controller;

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.servlet.ModelAndView;

    @Controller

    @RequestMapping(value="/user")

    public class MVCTestController {

    @RequestMapping(value="show1")

    public ModelAndView test1(){

    ModelAndView mv = new ModelAndView();

    mv.setViewName("hello");

    mv.addObject("msg", "MVCTestController =============test1");

    return mv;

    }

    }

     

    1. 使用RequestMapping映射请求

     

    在SpringMVC中的众多Controller以及每个Controller的众多方法,请求是如何映射到具体的处理方法上?这个就是靠@RequestMapping完成的。

    @RequestMapping既可以定义在类上也可以定义在方法上,

    请求映射的规则是:

       

    类上面的@RequestMapping.value + 方法上面的@RequestMapping.value

     

    1. 五种映射

    1、标准URL映射

    2、Ant风格的URL映射

    3、占位符映射

    4、限制请求方法映射

    5、限制参数映射

    1. 标准映射

     

    测试:

    1. Ant风格的URL映射

    通配符

    说明

    ?

    匹配任何单字符

    *

    匹配0或者任意数量的字符

    **

    匹配0或者更多的目录

     

    举例:

    @RequestMapping("/test/*/show")

    匹配:

    /hello/test/a/show.do

    /hello/test/b/show.do

    都是有效的。

     

    hello/test/a/b/c/show.do

     

    代码:

     

     

    测试:

    配置一个 /* 在地址栏中分别输入

    http://localhost:8080/demo/show1/a/test.do

    http://localhost:8080/demo/show1/b/test.do

     

    配置 /** 在地址栏输入

    http://localhost:8080/demo/show2/b/a/d/test.do

    http://localhost:8080/demo/show2/b/d/test.do

     

    1. 占位符映射

     

    Url中可以通过一个或多个{xxxx}占位符映射。

    通过@PathVariable("xxx")绑定到方法的入参中。

    例如:

    @RequestMapping("/user/{userId}/query")

    请求URL:

    http://localhost/user/8/query

     

     

    1. 限制请求方法映射

     

     

    限制请求方法:

     

     

    1. 限定请求参数

    Params里的参数编码不能有空格

     

     

    1. 处理方法与数据绑定(被动接受)

      1. 绑定servlet内置对象

     

     

     

    1. @PathVariable获取占位符中的参数

    1. @RequestParam

    注意:当defaultValue有值的时候,required自动修改成false

    未设置 defaultValue时,访问时必须带上绑定的参数,否则会报400错误

    设置defaultValue后,required属性失效,会自动给出默认值( defaultValue内设置的值)

     

    1. @CookieValue

    本地存储

     

     

     

    1. POJO对象绑定参数

    SpringMVC会将请求过来的参数名和POJO实体中的属性名进行匹配,如果名称一致,将把值填充到对象中。

     

    1. Java的基本数据类型绑定

     

     

    表单代码:

     

    <form action="/demos/demo1.action" method="post">

        <div>姓名:</div>

        <div><input name="name" value="张三"/></div>

        <div class="clear"></div>

        <div>年龄:</div>

        <div><input name="age" value="20"/></div>

        <div class="clear"></div>

        <div>收入:</div>

        <div><input name="income" value="100000"/></div>

        <div class="clear"></div>

        <div>结婚:</div>

        <div>

        <input type="radio" name="isMarried" value="true" checked="checked"/>是

        <input type="radio" name="isMarried" value="false"/>否</div>

        <div class="clear"></div>

        <div>兴趣:</div>

        <div>

        <input type="checkbox" name="interests" value="听歌" checked="checked"/>听歌

        <input type="checkbox" name="interests" value="书法" checked="checked"/>书法

        <input type="checkbox" name="interests" value="看电影" checked="checked"/>看电影

        </div>

        <div class="clear"></div>

        <div><input type="submit" value="提交表单"/></div>

    </form>

     

     

     

    1. 集合List绑定

     

    解决方案2:参考json处理。

     

    如果方法需要接受的list集合,不能够直接在方法中书写List

    List的绑定,需要将List对象包装到一个类中才能绑定

    要求:表单中的name的值

    要求表单name的值, 和封装的对象中的结合的属性名一致。

    如下:

     

    类:

     

     

     

    1. springmvc 和struts2的区别

     

    1. jsp 和jstl视图解析器

      1. 导入jstl的依赖

      2. jsp页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"

        pageEncoding="UTF-8"%>

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

    <!DOCTYPE html>

    <html>

    <head>

    <title>JSTL Demo</title>

    </head>

    <body>

        <table>

            <thead>

                <tr>

                    <th>ID</th>

                    <th>用户名</th>

                    <th>名称</th>

                    <th>年龄</th>

                </tr>

            </thead>

            <tbody>

                <c:forEach items="${users}" var="user">

                    <tr>

                        <td>${user.id}</td>

                        <td>${user.userName}</td>

                        <td>${user.name}</td>

                        <td>${user.age}</td>

                    </tr>

                </c:forEach>

            </tbody>

        </table>

    </body>

    </html>

     

    1. controller代码

    /**

    * return 集合数据到jsp页面

    * @return

    */

    @RequestMapping("test9")

    public ModelAndView test9(){

    ModelAndView mv = new ModelAndView();

    List<User> userList = new ArrayList<User>();

    for(Long i = 1L;i < 6L;i++){

    User u = new User();

    u.setId(i);

    u.setuserName("楚留香"+i+"");

    u.setName("盗帅"+i+"");

    u.setAge(700);

    userList.add(u);

    }

    mv.setViewName("users");

    mv.addObject("users", userList);

    return mv;

    }

     

     

    1. 使用ResponseBody输出JSON

      1. 10.1 ajax请求通常返回json数据,异步方法要使用@ResponseBody注解标明返回json

     

    单个对象的输出:

    @RequestMapping("getUser")

    @ResponseBody

    public User getUser(){

     

    User user = new User();

    user.setuserName("西门吹牛");

    user.setName("西门吹雪");

    user.setAge(1);

    return user;

    }

     

    集合的输出:

    @RequestMapping("getUsers")

    @ResponseBody

    public List<User> getUsers(){

     

    List<User> users = new ArrayList<User>();

    for(int i =0;i<8;i++){

    User user = new User();

    user.setuserName("西门吹"+i+"牛");

    user.setName("西门吹雪"+i);

    user.setAge(i+1);

    users.add(user);

    }

    return users;

    }

    1. RequestBody

     

    代码:

     

     

    测试:

     

     

     

    1. 文件上传

      1. 添加依赖

    <dependency>

                <groupId>commons-fileupload</groupId>

                <artifactId>commons-fileupload</artifactId>

                <version>1.3.1</version>

            </dependency>

     

    1. 定义文件上传解析器

    定义在springmvc-servlet.xml里面

    <!-- 定义文件上传解析器 -->

        <bean id="multipartResolver"

            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

            <!-- 设定默认编码 -->

            <property name="defaultEncoding" value="UTF-8"></property>

            <!-- 设定文件上传的最大值5MB5*1024*1024 -->

            <property name="maxUploadSize" value="5242880"></property>

        </bean>

     

    1. 代码:

    package cn.itcast.springmvc.controller;

     

    import java.io.File;

     

    import org.springframework.stereotype.Controller;

    import org.springframework.web.bind.annotation.RequestMapping;

    import org.springframework.web.bind.annotation.RequestParam;

    import org.springframework.web.multipart.MultipartFile;

     

    @RequestMapping("/file")

    @Controller

    public class FileUploadController {

    /**

    * 文件上传

    */

        @RequestMapping("/upload")

        public String upload(@RequestParam("file") MultipartFile multipartFile)

                throws Exception {

            if (multipartFile != null) {

              

                // multipartFile.getOriginalFilename() 获取文件的原始名称

                multipartFile.transferTo(new File("d:\\tmp\\" + multipartFile.getOriginalFilename()));

            }

            return "success";

        }

    }

    1. 测试

    1. 转发和重定向

     

    1. 重定向

    使用视图名字前加:redirect:/success.html

     

     

    访问路径:

     

    实际响应后路径:

     

    1. 转发:

    在视图名称前加上: forward:

     

    1. 拦截器

     

     

    1. 拦截器执行过程

     

    1. 编写自定义拦截器

     

    1. 配置拦截器

        <mvc:interceptors>

            <mvc:interceptor>

    <!--             path: 拦截所有请求 -->

                <mvc:mapping path="/**"/>

    <!--             class:指定拦截器 -->

                <bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor"/>

            </mvc:interceptor>

        </mvc:interceptors>

     

    1. 配置多个拦截器

    多个拦截器执行顺序遵循 先入后出 的原则,先执行的拦截器后执行完成

        <mvc:interceptors>

            <mvc:interceptor>

    <!--             path: 拦截请求 -->

                <mvc:mapping path="/user/**"/>

    <!--             class:指定拦截器 -->

                <bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor"/>

            </mvc:interceptor>

            <mvc:interceptor>

                <mvc:mapping path="/user/**"/>

                <bean class="cn.itcast.springmvc.interceptor.MyHandlerInterceptor2"/>

            </mvc:interceptor>

        </mvc:interceptors>

     

    1. 练习重点:

        <servlet>

            <servlet-name>springmvc</servlet-name>

            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    <!--         服务器启动时加载上面的DispatcherServlet -->

            <load-on-startup>1</load-on-startup>

        </servlet>

        <servlet-mapping>

            <servlet-name>springmvc</servlet-name>

    <!--         尽量不要配置/*,/*会拦截静态资源

                拦截以.do结尾的请求,拦截后交给DispatcherServlet处理 -->

            <url-pattern>*.do</url-pattern>

        </servlet-mapping>

     

    1. 视图解析器配置

    <!-- 配置视图解析器 -->

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

    <!--     前缀 -->

        <property name="prefix" value="/WEB-INF/views/"></property>

    <!--     后缀 -->

        <property name="suffix" value=".jsp"></property>

    </bean>

     

    1. Springmvc注解的使用(重点)

    @Controller : 注解一个控制器类,要配置注解扫描 <!-- 注解扫描 -->

    <context:component-scan base-package="cn.itcast.springmvc.controller"/>

    @RequestMapping(value="/**/{userid}/请求名称",method,param={}) :可以放在控制器类头,然后每个请求响应方法都应该有一个对应的mapping注解, 绝大多数时候,要求注解里的请求名称和方法名称保持一致,限定请求方式(method属性),限定请求参数(param属性),必须带某个参数或者必须不带某个参数,限定参数的值

    @RequestParam(value="参数名称") :绑定请求参数,要求请求中设定的参数必须带,如果没带可以设置默认值

    @RequestBody :将请求参数中的json数据转换成java对象

    @ResponseBody :将返回结果java对象转换成json数据的格式返回到视图 ,通常在异步请求中使用

    @PathVariable :获取请求路径占位符中的参数

    1. 笔记第7大项是练习的重点

    2. 文件上传和拦截器的定义,要求定义成功即可

posted @ 2017-01-10 22:56  beyondcj  阅读(486)  评论(0编辑  收藏  举报