springmvc框架
一个使用spring mvc框架的web项目,除了需要依赖spring核心的jar包之外,还需要依赖spring-web和spring-webmvc的jar包。项目全部依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.5</version>
</dependency>
</dependencies>
使用的是Maven新建项目,在新建项目后需要自己添加web模块,如果忘记了可以回看之前写的
配置web.xml文件[注意加载spring.xml文件,默认是/WEB-INF/applicationContext.xml,加载springmvc.xml,默认加载WEB/INF下的[servletname]-servlet.xml文件,如果配置了servlet,若没有这两个文件,运行就会报错]
<!--配置spring文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置springmvc前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
完整的springmvc.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">
<!--扫描controller组件-->
<context:component-scan base-package="com.jiuyue.controller"/>
<!-- 使用spring mvc提供的MappingJackson2HttpMessageConverter转换器,利用jackson工具包将返回的数据转换为json字符串 -->
<bean id="mappingJackson2HttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!-- 注入支持的媒体类型 -->
<property name="supportedMediaTypes">
<list>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!--开启注解-->
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="mappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
<!--静态资源 (js、images等)访问-->
<mvc:default-servlet-handler/>
<!--ViewResorver试图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/user/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
配置使用注解方式的处理器映射器(RequestMappingHandlerMapping)和处理器适配器(RequestMappingHandlerAdapter)
<!-- 配置注解方式的处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<!-- 配置注解方式的处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
项目中使用开启注解驱动的方法代替上面处理器映射器和处理器适配器的配置。
<!-- 配置注解映射器和注解适配器 -->
<mvc:annotation-driven/>
到这一步之后,我们先来创建一个处理器Handler,也叫Controller。在java下新建一个包,我这里的包名是"com.jiuyue.controller",在包下新建一个UserController类,使用@Controller注解声明这个类为处理器。
@Controller
public class UserController {
@RequestMapping(value = "login")
public String login(){
return "success";
}
@RequestMapping(value = "/doLogin",method = RequestMethod.POST)
public @ResponseBody
Map<String,Object> doLogin(String userName,String password
){
Map<String,Object> result = new HashMap<String, Object>();
result.put("error_code",0);
result.put("error_message","登录成功");
User user = new User(1,userName,password);
result.put("user",user);
return result;
}
我在UserController中添加了一个login方法,并使用@RequestMapping注解来映射,当访问的url为"login"时,处理器映射器获取到该bean的login方法,然后交由适配器执行这个方法。login方法返回一个字符串“success”,交由视图解释器解释获取到真正的视图返回。
有了处理器还需要在配置文件中配置bean扫描,扫描指定包下使用@controller注解的类作为spring mvc的处理器。
<!-- 自动扫描包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="com.jiuyue.controller" />
接着还需要配置视图解析器(InternalResourceViewResolver)。
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/" />
<property name="suffix" value=".jsp" />
</bean>
响应json数据
在实际开发中,我们经常需要将处理器结果转化为json字符串返回给客户端,如开发接口。那么spring mvc如何配置才能实现将结果转化为json字符串返回呢?
在处理器适配器中注入消息转换器。使用springmvc提供的MappingJackson2HttpMessageConverter转换器,该转换器是利用jackson工具包将返回的数据转换为json格式的。
修改spring-mvc配置文件,添加消息转换器的bean,在原来的处理器适配器中注入消息转换器。
<!-- 使用spring mvc提供的MappingJackson2HttpMessageConverter转换器,利用jackson工具包将返回的数据转换为json字符串 -->
<bean id="mappingJackson2HttpMessageConverter"
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<!-- 注入支持的媒体类型 -->
<property name="supportedMediaTypes">
<list>
<value>text/json;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
需要导入json处理的工具包jackson。将jackson-core、jackson-databind、jackson-annotations选择同一个版本的依赖配置添加到pom.xml文件中。
使用开启注解驱动的方式,配置消息转换器
<!-- 配置注解映射器和注解适配器 -->
<mvc:annotation-driven>
<mvc:message-converters>
<ref bean="mappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
在UserController处理器中添加一个方法,用来处理用户提交的登录请求。
@RequestMapping(value = "/doLogin",method = RequestMethod.POST)
public @ResponseBody
Map<String,Object> doLogin(String userName,String password
){
Map<String,Object> result = new HashMap<String, Object>();
result.put("error_code",0);
result.put("error_message","登录成功");
User user = new User(1,userName,password);
result.put("user",user);
return result;
}
方法解析:
- @RequestMapping注解:value的值指定当访问的url为“/doLogin”映射到该方法,method指定该方法只处理post请求。
- @ResponseBody注解:将方法返回的对象通过jackson转换器转换为json格式的字符串之后写入到response对象的body区。在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中。
{"error_message":"登录成功","error_code":0,"user":{"id":1,"userName":"jiuyue","password":"ddd"}}