SpringMVC 上手就用
1. SpringMVC理解
参考:Spring官方文档
2.继承接口实现
2.1 web.xml 配置
<?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:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.2 核心配置 文件 springmvc-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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--Handler-->
<bean id="/hello" class="com.luogs.controller.HelloController"/>
</beans>
2.3 Controller
package com.luogs.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//注意:这里我们先导入Controller接口
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
//ModelAndView 模型和视图
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中。Model
mv.addObject("msg","HelloSpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp
return mv;
}
}
2.4 hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Luogs</title>
</head>
<body>
${msg}
</body>
</html>
2.5 说明
- web.xml 注册DispatcherServlet,mapping匹配所有非jsp请求;关联springmvc-servlet.xml
- spring核心配置文件springmvc-servlet.xml
- BeanNameUrlHandlerMapping:Url和Bean映射处理
- SimpleControllerHandlerAdapter:Controler适配器
- InternalResourceViewResolver:视图解析器
- HelloController:测试类通过继承实现Controller
- 测试用的HelloController和hello.jsp
- 请求流程分析
- 用户请求通过DispatcherServlet
- DispathcherServlet调用**BeanNameUrlHandlerMapping通过Url和注册的Controler映射找到Controller
- DispathcherServlet调用SimpleControllerHandlerAdapter适配调用Controller
- Controller 返回hello,通过InternalResourceViewResolver找到/WEB-INF/jsp/hello.jsp
3. 注解实现mvc基本配置
3.1 web.xml 配置
<?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:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--1.注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有的请求;(不包括.jsp)-->
<!--/* 匹配所有的请求;(包括.jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.2 核心配置文件springmvc-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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1. 开启注解扫描包 -->
<context:component-scan base-package="com.luogs.controller"/>
<!--2. 过滤静态资源 -->
<mvc:default-servlet-handler/>
<!--3. 开启MVC注解 -->
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
3.3 Controller
package com.luogs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(Model model){
model.addAttribute("msg","你好,Spring");
return "hello";
}
@RequestMapping("/hello1")
public String hello1(Model model){
model.addAttribute("msg","hi!Spring");
return "hello";
}
}
3.4 hello.jsp
<%--
Created by IntelliJ IDEA.
User: ThinkPad
Date: 2020/3/23
Time: 12:10
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${msg}
</body>
</html>
3.5 说明
- web.xml 配置DispatcherServlet
- 注册DispatcherServlet
- 关联一个springmvc的配置文件:【servlet-name】-servlet.xml
- 设置系统启动时加载
- 配置Mapping为匹配所有请求(不包括jsp)
- spring核心配置文件springmvc-servlet.xml
- 开启注解扫描包
- 开启mvc注解驱动 annotation-driven
- 配置过滤静态资源
- 配置视图解析器
- Controller类注解实现
- @Controller 标记为 受Spring控制的控制器
- 方法/类注解@RequestMapping("/hello") 定义请求路径(http:/localhost:8080/webname/hello)
- 通过 Model 对象传参
- 通过返回值返回调用页面(经过视图解析器后识别为 /WEB-INF/jsp/hello.jsp)
- hello.jsp 测试,${msg}测试参数传值
- 在spring中一般采用@RequestMapping注解来完成映射关系,要想使@RequestMapping注解生效,必须在上下文中注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter实例,这两个实例分别在类级别和方法级别处理。annotation-driven配置帮助我们自动完成上述两个实例注入
4.Restful风格
package com.luogs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class RestController {
@RequestMapping(value = "/t1/{a}/{b}",method = RequestMethod.GET)
public String restTest(@PathVariable int a, @PathVariable int b, Model model)
{
model.addAttribute("msg",a+b);
return "hello";
}
}
说明:
- 请求可以直接在“/”后面添加参数传入,如: http://localhost:8080/mvc/t1/1/2
- @PathVariable 可以让参数接受Url的参数传值
- 定义请求路径为"/t1/{a}/{b}"
5.基本使用
5.1 重定向和转发
@RequestMapping(value = "/t2",method = RequestMethod.GET)
public String redirectTest(Model model)
{
model.addAttribute("msg","重定向");
return "redirect:index.jsp";
}
**说明:**默认是转发,加 **redirect:**为重定向
5.2 接收参数和回显
5.2.1 接收名称相同
//参数名相同接收传值
//http://localhost:8080/user/t2?usrid=22
@RequestMapping("/t2")
public String getUserById1(@RequestParam("userid") int id, Model model){
User user = new User();
user.setId(id);
user.setMen(true);
user.setName("参数名不同");
model.addAttribute("user","@RequestParam用户为:"+user);
System.out.println("@RequestParam用户为:"+user);
return "user";
}
控制台输出:用户为:User(id=22, name=参数名相同, isMen=true)
5.2.2 接收名称不同
//参数名不相同接收传值
//http://localhost:8080/user/t2?usrid=22
@RequestMapping("/t2")
public String getUserById1(@RequestParam("userid") int id, Model model){
User user = new User();
user.setId(id);
user.setMen(true);
user.setName("参数名不同");
model.addAttribute("user","@RequestParam用户为:"+user);
System.out.println("@RequestParam用户为:"+user);
return "user";
}
@RequestParam(“userid”)注解来指定前端传入参数名
控制台输出:@RequestParam用户为:User(id=22, name=参数名不同, isMen=true)
5.2.3 接收传递对象
//对象传值
//http://localhost:8080/user/t3?name=wo&id=22&men=true
@RequestMapping("/t3")
public String getUser(User user, Model model){
model.addAttribute("user","对象user用户为:"+user);
System.out.println("对象user用户为:"+user);
return "user";
}
控制台输出:对象user用户为:User(id=22, name=wo, isMen=true)
5.3 json
<script type="text/javascript">
var user = {
name:'小明',
sex:'男',
age:11
}
//1. 一个对象
console.log(user);
//2. 转化成字符串
var strUser = JSON.stringify(user);
console.log(strUser);
//3. 转化成对象
var jsonUser = JSON.parse(strUser);
console.log(jsonUser);
//4. 一个字符串
var strPerson = "{\"name\":\"小芳1\",\"sex\":\"女\"}";
console.log(strPerson);
//5. 转化成对象
var jsonPerson = JSON.parse(strPerson);
console.log(jsonPerson);
</script>
5.3.1 Jackson
-
导入依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.2</version> </dependency>
-
示例
//单个对象 @RequestMapping("/t") @ResponseBody public String json() throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); User user = new User(); user.setName("小明"); user.setSex("男"); user.setAge(11); String s = mapper.writeValueAsString(user); return s; } //集合 @RequestMapping("/t1") @ResponseBody public String json1() throws JsonProcessingException { User user = new User(); user.setName("小明"); user.setSex("男"); user.setAge(11); User user1 = new User(); user1.setName("小明1"); user1.setSex("男"); user1.setAge(12); User user2 = new User(); user2.setName("小明2"); user2.setSex("男"); user2.setAge(13); List<User> list = new ArrayList<>(); list.add(user); list.add(user1); list.add(user2); ObjectMapper mapper = new ObjectMapper(); String s = mapper.writeValueAsString(list); return s; }
-
乱码问题解决-applicationContext.xml添加
<mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
5.3.2 Fastjson
-
导入依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.67</version> </dependency>
-
示例
@RequestMapping("/t2") @ResponseBody public String json2() throws JsonProcessingException { User user = new User(); user.setName("小明"); user.setSex("男"); user.setAge(11); User user1 = new User(); user1.setName("小明1"); user1.setSex("男"); user1.setAge(12); User user2 = new User(); user2.setName("小明2"); user2.setSex("男"); user2.setAge(13); List<User> list = new ArrayList<>(); list.add(user); list.add(user1); list.add(user2); // String s = JSON.toJSONString(list); String s = JSON.toJSONString(user); return s; }