SpringMVC入门配置步骤
- pom.xml的打包方式改成war,增加jetty-plugin(jetty-plugin是和tomcat作用相同的一个容器,是maven的一个插件),增加spring-webmvc(spring-mvc依赖),jackson-databind(用于json数据的转换)
<packaging>war</packaging>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.40.v20210413</version>
<configuration>
<webApp>
<contextPath>/</contextPath>
</webApp>
<httpConnector>
<port>8081</port>
<host>localhost</host>
</httpConnector>
<scanIntervalSeconds>5</scanIntervalSeconds>
</configuration>
</plugin>
</plugins>
</build>
- 在src/main中新建webapp目录,并创建子目录WE-INF,在其中新建web.xml;在web.xml中配置中央控制器DispathcherServlet和监听器ContextLoaderListener
<servlet>
<servlet-name>rbac</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>rbac</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 在WEB-INF新建servletName-servlet.xml,applicationContext.xml两个spring配置文件;servletName-servlet.xml配置context:component-scan用于扫描Controller增加命名空间mvc:annotation-driven;配置匿名类:MappingJackson2MessageConverter用于Java对象与JSON之间的转换
servletName-servlet.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: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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.rbac.web"/>
<bean class="org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter"/>
<mvc:annotation-driven/>
</beans>
- 写Controller,类注解:RestController,RequestMapping(“role”),处理请求的方法注解GetMapping(“list”),返回java类型,SpringMVC会自动转为JSON
@RestController
@RequestMapping("role")
public class RoleController {
@Qualifier("roleService")
@Autowired
private RoleService roleService;
@GetMapping("test")
public String test(){
return "hello";
}
@GetMapping("list")
public List<Role> list(){
return roleService.getRoles();
}
}
- Maven:jetty:run,浏览器直接访问
SpringMVC配置详解
打包
package:影响运行和打包的方式,默认是jar,web项目一般指定为war
jetty-plugin
jetty和tomcat功能十分类似,都是servlet容器,由于tomcat的maven插件版本过老,所以使用jetty-plugin
jetty与tomcat区别
- jetty更轻量级,tomcat出了遵循Java servlet规范之外,还扩展了大量J2EE特性和满足企业级应用的需求,这种笨重在分布式尤其体现出浪费资源的缺陷
- jetty可插拔性和可扩展性更好,更易于开发者对jetty本身的二次开发
- 对于大型的企业级规模的应用,这时jetty就需要扩展,所以tomcat是更优的
DispatcherServlet和ContextLoaderListener
DispatcherServlet
- 充当中央控制器:所有的http请求都会发到中央控制器,再由中央控制器发到各部分的控制器
- 他会默认读取WEB-INF/servletName-servlet.xml配置文件,找到中央控制器的名字来找到对应名字的xml文件,作为子容器
ContextLoaderListener - 监听器(Listener):对事件进行监听,当事件发生时执行
- ContextLoaderListener:在上下文加载时,默认读取WEB-INF/applicationContext.xml文件,作为父容器
- 可以使用context-param参数配置contextConfigLocation指定配置文件的位置
applicationContext.xml和servletName-servlet.xml
- applicationContext.xml:
它对三层架构中的service层,dao层进行配置,通过ContextLoaderListener来进行加载,作为父容器,每个子容器都可以访问到这个容器中的bean
- servletName-servlet.xml
它对三层架构中的web层进行配置,通过DispatcherServlet进行加载,多个DispatcherServlet对应多个容器,它作为子容器(多个中央控制器的应用场景:对pc端和移动端分别进行返回不同的响应)
- springmvc并不是一定要按照这样的格式来配置容器,但是这样可以让应用之间的逻辑层次更清晰
mvc:annotation-driven
启用springmvc中默认未启用的功能,如启动注解
RestController和Controller
控制器的方法可能返回json数据,或页面等其他资源,使用注解Controller时,对于返回数据的方法,需要使用到注解@ResponseBody,如果控制器中所有方法都是返回的数据,则可以免去方法注解,将类注解由Contrller改成RestController
@RestController:简化响应为数据的注解,是一个组合注解
@Controller:修饰一个控制器,用于处理请求和响应
@ResponseBody:修饰的方法返回的是数据,配置了转换器会自动转换为JSON
XXXMapping
配置请求的路径(value)
- RequestMapping:value配置请求的路径,method配置请求的类型,method属性值为枚举RequestMethod
- GetMapping/PostMapping等:只需要用value配置请求的路径,不同的注解内部已经配置好了请求类型,省去了method属性的赋值
SpringMVC参数传递
字符串
写法一
简单的数据类型,直接给控制器的目标方法添加参数,需要请求参数名和方法参数名一致,可以将请求参数直接拼接到URL中
例:
@GetMapping("one")
public Role one(int id){
return roleService.getRole(id);
}
写法二
简单数据类型,在方法的注解XXXMapping的value属性中,添加/{参数名},然后在方法参数中使用注解@PathVariable
(“参数名”),这样传参时不用指定参数名,只用按照路径的格式顺序依次写入参数值即可
例:
//请求路径如:/one/1
@GetMapping("one/{id}")
public Role one(@PathVariable("id")int id){
return roleService.getRole(id);
}
- 简单数据类型,如上
- 数组类型,只要名字对应,框架会自动封装为数组,且转化为合适的类型
- 对于对象类型,只要对象的属性名对应,框架会自动调用set方法,将属性set到参数中的对象中去,对于未传值的则会是对应数据类型的默认值,如果传入的参数是json对象的话,需要在方法参数前实用@RequestBody来讲json转化为java对象