一、快速开始
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文件中创建。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextconfigLocation</param-name>
<param-value>classpath:springmvc.xml<param-value>
</init-param>
<!--当不设置该值或该值小于0时表示有请求才创建serlvet
当改制大于等于0表示服务启动时创建servlet,值越小,创建越早。-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- DispatcherServlet在初始化时,需要加载springmvc的配置文件。
- 如果不配置contextconfigLocation,那么默认在WEB-INF目录下寻找<servlet-name>-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>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>
<!--强制请求对象使用encoding编码方法-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!--强制应答对象使用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>
三.控制器方法返回值
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.访问静态资源存在问题
如果中央调度器的<url-pattern>*.do</url-pattern>改为<url-pattern>/</url-pattern>,则静态资源例如js,jpg,html都会无法访问。原因如下:
- 没改/前,只有*.do都会被中央调度器给拦截,中央调度器中交给后端控制器来处理这些请求。其他的静态资源会由tomcat默认的servlet处理。
- 改了/后,所有的请求都被中央调度器拦截了,但是后端控制器中又没有对应的方法去处理这些静态请求,所有静态资源就没法访问了。
- 因为jsp文件会被转化成servlet,所以jsp文件可以被访问。
2.解决方案一
在springmvc的配置文件中加入
<mvc:default-servlet-handler/>
但是要注意,加入该标签后,一定要加入注解驱动标签。应为该标签和@RequestMapping有冲突。
3.解决方案二
在springmvc配置文件中加入:
<mvc:resource mapping = "访问静态资源的url,可以使用通配符**"
location="静态资源在项目中的位置,从webapp开始"/>