SpringMVC
pom.xml配置
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.3.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
web.xml 配置
<web-app>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 在sprMVC中, / /* 这是拦截所有url
/:只匹配所有请求,不会去匹配jsp页面
/*:匹配所有请求,包括jsp
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置处理器适配器
<!--配置控制器适配器
所有的处理适配器都实现HandlerAdapter接口
-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
编写Handler
需要实现Controller接口 才能由SimpleControllerHandlerAdapter这个适配器执行
public class StudentController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv=new ModelAndView();
Student student=new Student();
student.setName("哇哈哈");
mv.addObject("student",student);
mv.setViewName("index");
return mv;
}
}
配置处理器映射器
<!--配置控制映射器-->
<!--配置handler-->
<bean name="/123.action" id="hemoeController1" class="controller.StudentController"></bean>
<!--处理器映射器讲bean的name作为url进行查找
需要配置handler时指定bean的name,即指定访问的url-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
视图解析器
<!--配置视图解析器
解析jsp。默认使用jstl,需要jstl包-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
使用注解
注解的处理器映射器和适配器
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。 使 用 mvc:annotation-driven 自动加RequestMappingHandlerMapping (处理映射器) 和RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用mvc:annotation-driven替代注解处理器和适配器的配置。
它就相当于在 xml 中配置了:
<!-- Begin -->
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<bean
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- HandlerAdapter -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<bean
class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- HadnlerExceptionResolvers -->
<bean
class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"></bean>
<bean
class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver"></bean>
<bean
class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver"
></bean>
<!-- End -->
配置案例:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
@Controller
public class StudentController {
@RequestMapping("/abc.action")
public String getHome(){
return "index";
}
}
RequestMapping 建立请求 URL 和处理请求方法之间的对应关系
作用: 用于建立请求 URL 和处理请求方法之间的对应关系。
@RequestMapping(value = "/abc.action",method = RequestMethod.GET)
public String getHome(){
return "index";
}
RequestParam注解 为参数取别名
为参数取别名,前端传递的时候就以 username为准
@GetMapping("/u1")
public String test1(@RequestParam("username") String name, Model model){
//加上@RequestParam则前端传入的参数为注解value
//接收前端参数
System.out.println("接收到的前端参数为:"+name);
//将返回的结果传递给前端,model
model.addAttribute("msg",name);
//视图跳转
return "test1";
}
RequestBody 获取请求体内容
作用: 用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。 get 请求方式不适用。 属性: required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值 为 false,get 请求得到是 null。
使用示例:
<form action="anno/testRequestBody" method="post">
用户姓名:<input type="text" name="username" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
/**
* 获取到请求体的内容
* @return
*/
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println("执行了...");
System.out.println(body);
return "success";
}
执行结果:
//输出结果:
username=admin&age=11
PathVaribale 用于绑定 url 中的占位符
作用: 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。 url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。 属性: value:用于指定 url 中占位符名称。 required:是否必须提供占位符
使用示例
<a href="anno/testPathVariable/10">testPathVariable</a>
/**
* PathVariable注解
* @return
*/
@RequestMapping(value="/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id){
System.out.println("执行了...");
System.out.println(id);
return "success";
}
RequestHeader 获取请求消息头
作用: 用于获取请求消息头。 属性: value:提供消息头名称 required:是否必须有此消息头 注: 在实际开发中一般不怎么用。
<a href="anno/testRequestHeader">RequestHeader</a>
/**
* 获取请求头的值
* @param header
* @return
*/
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header, HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("执行了...");
System.out.println(header);
// return "success";
// response.sendRedirect(request.getContextPath()+"/anno/testCookieValue");
return "redirect:/param.jsp";
}
CookieValue 把指定 cookie 名称的值传入控制器方法参数
作用: 用于把指定 cookie 名称的值传入控制器方法参数。 属性: value:指定 cookie 的名称。 required:是否必须有此 cookie。
使用示例
<a href="anno/testCookieValue">CookieValue</a>
/**
* 获取Cookie的值
* @return
*/
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
System.out.println("执行了...");
System.out.println(cookieValue);
return "success";
}
ModelAttribute 用于修饰方法和参数
作用: 该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可 以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。 属性: value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。 应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数 据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。
使用示例
<form action="anno/testModelAttribute" method="post">
用户姓名:<input type="text" name="uname" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
/**
* ModelAttribute注解
* @return
*/
@RequestMapping(value="/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println("testModelAttribute执行了...");
System.out.println(user);
return "success";
}
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
System.out.println("showUser执行了...");
// 通过用户查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc",user);
}
/**
* 该方法会先执行
@ModelAttribute
public User showUser(String uname){
System.out.println("showUser执行了...");
// 通过用户查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
*/
SessionAttribute 多次执行控制器方法间的参数共享
作用: 用于多次执行控制器方法间的参数共享。 属性: value:用于指定存入的属性名称 type:用于指定存入的数据类型。
<a href="anno/testSessionAttributes">testSessionAttributes</a>
<a href="anno/getSessionAttributes">getSessionAttributes</a>
<a href="anno/delSessionAttributes">delSessionAttributes</a>
@Controller
@RequestMapping("/anno")
@SessionAttributes(value={"msg"}) // 把msg存入到session域对中
public class AnnoController {
}
/**
* SessionAttributes的注解
* @return
*/
@RequestMapping(value="/testSessionAttributes")
public String testSessionAttributes(Model model){
System.out.println("testSessionAttributes...");
// 底层会存储到request域对象中
model.addAttribute("msg","美美");
return "success";
}
/**
* 获取值
* @param modelMap
* @return
*/
@RequestMapping(value="/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
System.out.println("getSessionAttributes...");
String msg = (String) modelMap.get("msg");
System.out.println(msg);
return "success";
}
/**
* 清除
* @param status
* @return
*/
@RequestMapping(value="/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
System.out.println("getSessionAttributes...");
status.setComplete();
return "success";
}
RestController 不走视图解析器直接返回字符串
在类上使用
RestFul 风格
这时浏览器输入的url 就是 http://localhost:8080/t1/aaaa/bbbb
aaaa和bbbb 就是输入的参数
@RequestMapping("/t1/{aa}/{bb}")
public String t1(@PathVariable String aa,@PathVariable String bb, HttpServletRequest req){
String s = aa + bb;
req.setAttribute("hhh","合并字符串为"+s);
return "wahh";
}
转发和重定向
转发
@RequestMapping("/t4")
public String t4(Map<String,String> mp){
mp.put("whh","转发的页面");
return "wahh";
}
重定向
@RequestMapping("/t5/{name}")
public String t5(@PathVariable String name,HttpServletRequest req, HttpServletResponse rsp){
//重定向的页面
req.getSession().setAttribute("name", name);
//重定向调用的是其他方法的 URL
return "redirect:/t4";
}
向后台参数的传递
传递的参数一般要名字一致
通过map传递
@RequestMapping("/wahh") //url
public String getHome(Map<String,String> mp){
mp.put("whh","/wahh");
return "wahh";
}
通过对象传递
@GetMapping("/u2")public String test2(User user){
System.out.println(user);
return "test1";
}
通过request传递
@RequestMapping("/hhh")
public String gethhh(HttpServletRequest req){
req.setAttribute("hhh","阿弥陀佛");
return "wahh";
}
通过基本类型传递
有String boolean Integer int 等
@RequestMapping("/hhh")
public String gethhh(String sss){
System.out.println(sss);
return "wahh";
}
向前端的返回数据
第一种 ModelAndView
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv=new ModelAndView();
Student student=new Student();
student.setName("哇哈哈");
mv.addObject("student",student);
mv.setViewName("wahh");
return mv;
}
第二种 Model
@GetMapping("/u1")
public String test1( Model model){
//将返回的结果传递给前端,model
model.addAttribute("msg","name");
//视图跳转
return "test1";
}
第三种 ModelMap
LinkedHashMap-->>ModelMap-->>model 上下关系
ModelMap 继承了LinkedHashMap,拥有它的全部功能
Model 精简版(大部分情况下,我们都直接使用Model) @GetMapping("/u3")
public String test3(ModelMap map){
map.addAttribute("name","nameeeee");
return "test1";
}
小结
Model 只有寥寥几个方法只适合储存数据,简化了新手对于Model对象的操作和理解
ModelMap 继承了LinkedHashMap,除了实现了自身的一些方法同样继承了LinkedMap的方法和特性
ModelAndView 可以在储存数据的同事,可以进行设置发挥的了逻辑视图,进行控制展示层的跳转
乱码处理
在web.xml中加入
<!-- 解决参数乱码问题-->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JSON
json键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号:分隔,然后紧接着值:
{"name":"adsfasdfasdfasd"}
{"age":"6"}
{"sex":"难"}
JSON 和 JavaScript 对象可以互转
要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}
要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'
json乱码处理 在spring配置文件下添加配置
<!-- json乱码解决-->
<mvc:annotation-driven>
<mvc:message-converters>
<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>
返回 json 对象
<!--pom.xml导入依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
@RequestMapping("/js1")
@ResponseBody //不走视图解析器直接返回
public String json1() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
User user = new User();
String s = mapper.writeValueAsString(user);
return s;
}
Fastjson
导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.73</version>
</dependency>
jsonobject 代表 json 对象
jsonarray 代表 json 对象数组
json 代表 jsongobject 和 jsonarray 的转化