一文掌握如何使用SpringMVC

一、快速开始

1.新建web项目,加入依赖

    <!-- servlet的依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- springmvc的依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.2.5.RELEASE</version>
    </dependency>

2.创建DispatcherServlet

  • DispatcherServlet叫做前端控制器,它的作用就是接收请求,响应结果。
  • 在它的init方法中,它会读取xml,创建springmvc的容器对象。
  • DispatcherServlet本质上就是一个Servlet对象,他的父类是HttpServlet。作为一个Servlet对象,它也是在web.xml文件中创建。

一文掌握如何使用SpringMVC_第1张图片

<servlet>
	<servlet-name>springmvcservlet-name>
	<servlet-class>org.springframework.servlet.DispatcherServletservlet-class>
	<init-param>
		<param-name>contextconfigLocationparam-name>
		<param-value>classpath:springmvc.xml<param-value>
	init-param>
	
	<load-on-startup>1load-on-startup>
servlet>

<servlet-mapping>
	<servlet-name>springmvcservlet-name>
	<url-pattern>*.dourl-pattern>
servlet-mapping>
  • DispatcherServlet在初始化时,需要加载springmvc的配置文件。
  • 如果不配置contextconfigLocation,那么默认在WEB-INF目录下寻找-servlet.xml文件,没有该文件就报错就报错。
  • 设置contextconfigLocation,就会寻找contextconfigLocation设置目录下的自定义文件名xml文件.
  • 例如在上面代码中就会去寻找资源路径下的springmvc.xml文件,没设置contextconfigLocation的话就会在WEB-INF目录下寻找springmvc-servlet.xml文件。

3.创建后端控制器

后端控制器就是一个普通的java类,在该类上加上@Controller。
在该类中实现方法,在该方法上添加@RequestMapping(value = “/url”),该方法就可以当作servlet去处理对应路径的请求。

4.创建springmvc配置文件

<!--组件扫描器-->
<context:component-scan base-package = "包路径"/>

<!--注解驱动-->
<mvc:annotation-driven/>

<!--视图解析器,返回的视图url为:prefix前缀+后端控制器返回的值+suffix后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
    <property name="prefix" value="/WEB-INF/report/"/>  
    <property name="suffix" value=".jsp"/>  
    <property name="order" value="0"/>
</bean> 

5.注意

  • 放在WEB-INF下的文件是受保护的,在程序外是无法访问的,但是在程序内是可以调用和访问的。
  • @RequestMapping的value属性是一个数组,所以可以支持多个请求由一个方法处理@RequestMapping(value = {"/url1","/url2"})
  • @RequestMapping也可以使用在类上,表示该类的所有方法公用的前缀
  • @RequestMapping还有一个method属性,用来表示该方法接收的是get请求还是post请求。例如:@RequestMapping(value = “url”,method = RequestMethod.POST)

二.请求的参数

1.默认参数

对于所有的处理器方法,在方法的形参中都可以设置HttpServletRequset,HttpServletResponse,HttpSession三个参数,这三个参数在系统调用时会自动赋值。

2.逐个接收

  • 前端请求的参数和方法的形参列表相同,按名称接收请求对象。
  • 请求参数和方法参数名不一样,在参数前面使用@RequestParam(value = “请求参数名”)。

3.对象接收参数

控制器方法的形参是java对象,并且java对象的属性名要和请求参数名相同。

4.解决post请求乱码

<filter>
	<filter-name>CharacterEncodingFilterfilter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
	<init-param>
		
		<param-name>encodingparam-name>
		<param-value>utf-8param-value>
	init-param>
	<init-param>
		
		<param-name>forceRequestEncodingparam-name>
		<param-value>trueparam-value>
	init-param>
	<init-param>
		
		<param-name>forceResponseEncodingparam-name>
		<param-value>trueparam-value>
	init-param>
filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilterfilter-name>
	<url-pattern>/*url-pattern>
filter-mapping>

三.控制器方法返回值

1.ModelAndView

返回数据和视图

// springmvc框架会将mv.addObject数据存放到request作用于中
// 会将mv.setViewName执行forward请求转发
public ModelAndView test(){
	mv.addObject("key",value);
	mv.setViewName("视图的url路径");
	return mv;
}

2.String

如果返回值是一个string,则默认是将返回的string对象当作视图的url,然后执行forward转发操作。

3.void

返回值是void一般用来对ajax请求进行处理。

4.对象

注意,返回值类型为对象时要搭配@ResponseBody注解一起使用。
框架提供了HttpMessageConverter接口能实现:

  • 将多个简单类型参数或json数据,请求控制器方法时,能自动转为java对象赋给控制器方法的形参。
  • 控制器方法返回对象时,能自动把对象转为json或其他数据格式。

HttpMessageConverter接口有很多实现类,主要的两个实现类为:

  • MappingJackson2HttpMessageConverter:用jackson工具库的objectMapper将java对象转为json数据格式
  • StringHttpMessageConverter:把字符串类型的数据,进行格式转换和编码

springmvc根据方法的返回值来自动选择使用HttpMessageConverter的实现类进行转换。默认情况下,springmvc只使用HttpMessageConverter的四个实现类,其中没有MappingJackson2HttpMessageConverter。需要在springmvc配置文件中加入注解驱动,加入后,会使用7个实现类对象。

5.@ResponseBody

  • 默认情况下,控制器方法的返回值都是视图。如果方法返回值不想返回一个视图,想返回数据就使用@ResponseBody注解,
  • 该注解可以将方法的返回值通过适当的HttpMessageConverter实现类转换为指定的格式后,然后写到response对象的body。
  • 该注解可以放在方法上,表示该方法返回数据给请求者。
    也可以放在类上,表示该类中所有的方法都只返回数据。
  • @ResponseBody注解+@Controller注解 = @ResController注解
  • 使用该方法后,会出现乱码问题。因为默认当你没设置@ResponseBody的produces属性时,它会按照iso8859-1编码。需要指定produces = ”test/plain;charset="uft-8”

静态资源

1.访问静态资源存在问题

如果中央调度器的*.do改为/,则静态资源例如js,jpg,html都会无法访问。原因如下:

  • 没改/前,只有*.do都会被中央调度器给拦截,中央调度器中交给后端控制器来处理这些请求。其他的静态资源会由tomcat默认的servlet处理。
  • 改了/后,所有的请求都被中央调度器拦截了,但是后端控制器中又没有对应的方法去处理这些静态请求,所有静态资源就没法访问了。
  • 因为jsp文件会被转化成servlet,所以jsp文件可以被访问。

2.解决方案一

在springmvc的配置文件中加入

<mvc:default-servlet-handler/>

但是要注意,加入该标签后,一定要加入注解驱动标签。应为该标签和@RequestMapping有冲突。

3.解决方案二

在springmvc配置文件中加入:

<mvc:resource mapping = "访问静态资源的url,可以使用通配符**" 
	location="静态资源在项目中的位置,从webapp开始"/>

你可能感兴趣的:(SSM框架学习,java,springmvc,servlet)