龙猫Java自学-SpringMVC

一、SpringMVC概述

Spring MVC是由spring官方提供的基于MVC设计理念的web框架

Spring MVC是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互

1.1SpringMVC的优势

  • 严格遵守了MVC分层思想

  • 采用了松耦合、插件式结构,相比较于我们封装的BaseSerlet以及其他的一些MVC框架来说更灵活、更具有扩展性

  • Spring MVC是基于Spring的扩展。提供了一套完善的MVC注解

  • Spring MVC在数据绑定、视图解析都提供了多种处理方式,可灵活配置

  • Spring MVC对RESTful设计方法提供了良好的支持

1.2 SpringMVC本质工作

  • 接收并解析请求

  • 处理请求

  • 数据渲染、响应请求

二、Spring MVC框架部署

2.1基于Maven创建一个web项目

2.2添加SpringMVC依赖

  • spring-context

  • spring-aspects

  • spring-jdbc

  • spring-test

  • spring-web

  • spring-webmvc

<properties>
       <spring.version>5.2.13.RELEASE</spring.version>
   </properties>
   <dependencies>
​
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>${spring.version}</version>
       </dependency>
​
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aspects</artifactId>
           <version>${spring.version}</version>
       </dependency>
​
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-jdbc</artifactId>
           <version>${spring.version}</version>
       </dependency>
​
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>${spring.version}</version>
       </dependency>
​
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-web</artifactId>
           <version>${spring.version}</version>
       </dependency>
​
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>${spring.version}</version>
       </dependency>
​
   </dependencies>

2.3创建SpringMVC配置文件

  • 在resources目录下创建名为 spring-servlet.xml 的文件

<!---作用:声明框架创建的项目中的各种对象,主要是创建Controller对象-->
   <!--声明springmvc核心对象,中央调度器
   DispatcherServlet的作用:
        1。在init()中创建springmvc的容器对象,创建springmvc配置文件在的所有Java对象,Java对象就是Controller对象
        2。DispatcherServlet是一个servlet,能狗接收请求
   -->
   <servlet>
       <servlet-name>springmvc</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
​
       <!--自定义配置文件的位置 。在resources目录-->
       <init-param>
           <param-name>contextConfigLocation</param-name>
           <param-value>classpath:springmvc.xml</param-value>
       </init-param>
       <!---->
   </servlet>
   <!--访问/hello-->
   <servlet-mapping>
       <servlet-name>springmvc</servlet-name>
       <!--url-pattern:把一些请求交给指定的servlet处理-->
       <url-pattern>*.do</url-pattern>
​
   </servlet-mapping>
​

配置文件的加载顺序和功能

1.tomcat服务器启动,读取web.xml 根据web.xml 文件中的说明,创建对象

创建DispatcherServlet他的对象,会执行init()方法。在init()方法中会执行springmvc容器对象创建

Web ApplicationContext cx = new ClassPathXml ApplicationContext("calsspath:springmvc.xml");

2.springmvc框架,new ClassPathXml ApplicationContext() 读取springmvc的配置文件

   <!--springmvc配置文件
   声明组件的扫描器
   -->
   <context:component-scan base-package="com.max.controller"/>
   <!--
   声明视图解析器:帮助处理视图,controller中指定视图路径太多时在配置文件中自定义
   -->
   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!--前缀:指定视图文件的 路径-->
       <property name="prefix" value="/WEB-INF/"/>
       <!--后缀:视图文件的扩展名-->
       <property name="suffix" value=".jsp"/>
   </bean>

使用组件扫描器base-package=“com.max.controller” , 遍历controller包中的所有类,

找到xxx类中的@Controller,@RequestMapping注解,就能创建xxx类对象。

知道了some.do的请求是执行doSome()方法

2.4 在web.xml 中配置SpringMVC的前端控制器

SpringMVC提供了一个名为DispatcherServlet的类(SpringMVC前端控制器),用于拦截用户请求由SpringMVC处理

<?xml version="1.0" encoding="UTF-8" ?>
<web-app    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
​
           xsi:schemaLoaction="http://xmlns.jcp.org/xml/ns/javaee
                       http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
           vsersion="3.1">
​
​
   <servlet>
       <servlet-name>SpringMVC</servlet-name>
       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
       <initp-param>
           <param-name>contextConfigLocation</param-name>
           <param_value>classpath:spring-servlet.xml</param_value>
       </initp-param>
       <load-on-startuo>1</load-on-startuo>
   </servlet>
   <servlet-mapping>
       <servlet-name>SpringMVC</servlet-name>
       <url-pattern>/*</url-pattern>
   </servlet-mapping>
 <!-- /* 拦截所有的http请求,包括.jsp的请求,都作为控制器类的请求来处理
/ 拦截所有的http请求,不包括.jsp的请求,都作为控制器类的请求来处理
-->
</web-app>

SpringMVC框架的使用

在SpringMVC中,我们把接收用户请求、处理用户请求的类称为Controller(控制器)

3.1创建控制器

  • 创建一个名为com.qfedu.controller的包(包需要在spring注解扫描的范围内)

  • 创建一个类(无需做任何的继承和实现)

  • 在类上添加@Controller 注解声明此类为SpringMVC的控制器

  • 在类上添加@RequestMapping(“url”)声明此控制器类的请求url

    @Controller
    @RequestMapping("/book")
    public class BookController {
    }

3.2在控制器类中定义处理请求的方法

  • 在一个控制器类中可以定义多个方法处理不同的请求

  • 在每个方法上添加@RequestMapping(“url”)用于声明当前方法请求的url

   @RequestMapping("/add")
   public void add(){
       System.out.println("11111");
​
​
  }
   @RequestMapping("/list")
   public void list(){
       System.out.println("2222222");
  }

3.3 静态资源放行配置

xml中配置文件

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

3.4 接收请求中的参数

HttpServletRequest request, HttpServletResponse response, HttpSession session
只需在控制器方法的形参列表中添加上面这个

3.4.1逐个接收

逐个接收,请求中的参数名和控制器方法的形参名一样,按照名称对象接收参数

 <form> action="/some.do">
  姓名:<input type="text" name="name"></br>
  年龄:<input type="text" name="age"></br>
   <input type="submit" value="提交">
 </form>

@Controller中

   @RequestMapping(value = "/some.do")
   public ModelAndView doSome(String name,Integer age)

接收参数的问题:

1.参数最好使用包装类型

2.post请求乱码问题

接收请求时,POST请求,使用中文时会出现乱码

在web.xml声明过滤器

   <!--声明过滤器,框架提供的,解决post请求中的乱码问题-->
   <filter>
       <filter-name>characterEncodingFilter</filter-name>
       <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
       <!--给过滤器属性赋值-->
       <init-param>
           <!--项目使用的字符编码-->
           <param-name>encoding</param-name>
           <param-value>utf-8</param-value>
       </init-param>
​
       <init-param>
           <!--强制请求(request) 对象使用encoding的编码方式-->
           <param-name>forceRequestEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
       <init-param>
           <!--强制应答(response) 对象使用encoding的编码方式-->
           <param-name>forceResponseEncoding</param-name>
           <param-value>true</param-value>
       </init-param>
   </filter>
   <!--强制所有请求,先经过过滤器处理-->
   <filter-mapping>
       <filter-name>characterEncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

逐个接收请求参数:请求中参数名和形参名不一样

public ModelAndView doSome(@RequestParam(value = "iname")String name,int age)

required:boolen类型,默认是true,请求中必须有此参数,没有的话报错

public ModelAndView doSome(@RequestParam(value = "iname",required = false)String name,int age)

3.4.2 对象接收

对象接收:在控制器方法的形参时Java对象,使用Java对象的属性接收请求中参数值

要求:Java对象的属性名和请求中参数名一样

public class Student {
   private String name;
   private Integer age;
}//再get set
​
//控制器
   @RequestMapping("/roe.do")
   public ModelAndView doRoe(Student student){
       ModelAndView mv = new ModelAndView();
       mv.addObject("myname",student.getName());
       mv.addObject("myage",student.getAge());
       mv.setViewName("show");
       return mv;
​
  }

3.5 void 没有数据和视图

HttpMessageConverter 消息转换器

作用,实现请求的数据转为Java对象,把控制器方法返回的对象转为json,xml,text等不同格式的数据

   public void reAjax(HttpServletResponse response,String name,Integer age){
       //调用service得到结果对象
       Student student = new Student();
       student.setName(name+"同学");
       student.setAge(age);
​
       //HttpMessageConverter 消息转换器,对象转为json
       OjectMapping om =new OjectMapping();
       String json = om.wirteValueAsString(student);
       System.out.println("服务器对象转为的json"+json);
​
       //输出json。响应ajax
       response.setContentType("application/json;charset=utf-8");
       PrintWriter pw = response.getWriter();
       pw.println(json);
       pw.flush();
       pw.close();

怎么使用实现类:

框架根据控制器方法的返回类型,自动查找使用的实现类。

@RequestMapping("/reAjax.do")
   public Student reAjax(String name,Integer age){
       //调用service得到结果对象
       Student student = new Student();
       student.setName(name+"同学");
       student.setAge(age);
       return student;

默认情况下:springmvc使用了HttpMessageConverter接口的4个实现类。包括了StringHttpMessageConverter。

需要在springmvc的配置文件,加入注解驱动的标签mvc:annotation-driven

加上这个标签,springmvc项目启动后,会创建HttpMessageConverter接口的7歌实现类对象,

包括了StringHttpMessageConverter和Mapping jackson2HttpMessageConverter

3.5.2 @ResponseBody

@ResponseBody注解的作用,就是把stduent转换后的json通过HttpServletResponse对象输出给浏览器

response.setContentType("application/json;charset=utf-8");
PrintWriter pw = response.getWriter();
pw.println(json);
pw.flush();
pw.close();
​
@ResponseBody 注解作用就上面的代码的实现

3.5.3 控制器方法返回对象转为json 的步骤

1.pom.xml 加入jackson依赖,springmvc框架,默认处理json就是i使用jacson

2.在springmvc配置文件,加入注解驱动 mvc:annotation-dirven

3.在控制器方法的上面加入@ResponseBody注解,表示返回值数据,输出到浏览器

   @RequestMapping("/reAjax.do")
   @ResponseBody
   public Student reAjax(String name,Integer age){
       //调用service得到结果对象
       Student student = new Student();
       student.setName(name+"同学");
       student.setAge(age);
       return student;
​
  }

3.5.4 返回值是String,如何解决Ajax中乱码的方法

// 区别返回值String是数据还是视图
//-----方法上面有@ResponseBody注解就是数据,没就是视图
​
//解决中文乱码,需要使用@RequestMapping的produces属性
​
@RequestMapping("/reAjax.do" produces="text/plain;charset=utf-8")
@ResponseBody
public String reString(String name,Integer age){
  System.out.println("控制器方法返回String,是数据");
  return "Hello,SpringMVC注解式开发";
}

3.6 静态资源处理

1.url-pattern 中央调度器

<servlet-mapping>
   <servlet-name>springmvc</servlet-name>
   <!--url-pattern:把一些请求交给指定的servlet处理-->
   <url-pattern>/</url-pattern>
</servlet-mapping>

设置“ / ” ,导致中央调度器成为了默认的defual servlet

需要处理静态资源和其他的未映射的请求,但默认的中央调度器没有处理静态资源的控制器对象,所以静态资源都是404,只有some.do这个请求有MyController对象,才能访问

2. 静态资源处理

第一种

<!--声明:静态资源
default-servlet-handler 和@RequestMapping 有冲突,
要加上注解驱动
<mvc:annotation-driven/>
​
优点:解决方式简单
缺点:依赖于tomcat
-->
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>

第二种(重要)

在springmvc配置文件中加入一个mvc:resources标签,框架会创建ResourceHttpRequestHandler控制器对象,使用这个对象处理静态资源的访问,不依赖tomcat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值