• 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. 文件上传和拦截器的定义,要求定义成功即可

  • 相关阅读:
    JAVA for(i = 0; i<a.length; i++) 解析
    3.2.2多维数组 3.3 排序
    3.2数组
    字符串和数组
    2.7.3与程序转移有关的跳转语句
    2.7.2 循环语句
    读书共享 Primer Plus C-part 4
    Linux 批量修改文件名
    关于/usr/local/lib/libz.a(zutil.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC解决办法
    做一个有深度的程序猿
  • 原文地址:https://www.cnblogs.com/beyondcj/p/6271173.html
Copyright © 2020-2023  润新知