一、SpringMVC简介
SpringMVC是Spring子框架
SpringMVC属于SpringFrameWork的后续产品,是Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架
MVC设计理念:Model View Controller 【数据模型、视图对象、控制器(处理器)】,主要:将封装数据模型、封装视图对象、协调调度控制器(处理器)解耦。
2、SpringMVC之HelloWorld
①新建web工程
②导入jar包
<!--spring-webmvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 导入thymeleaf与spring5的整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!--servlet-api-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
③在web.xml中配置前端控制器【核心控制器】:DispatcherServlet
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 设置springMVC核心配置文件路径-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 设置Servlet优先级:启动服务器,创建当前DispatcherServlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- 匹配当前项目下,除了jsp的所有路径-->
<url-pattern>/</url-pattern>
</servlet-mapping>
url配置为:/ 【原因:tomcat->conf->web.xml如下配置】
<!-- The mapping for the default servlet -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
④编写springMVC配置文件:springmvc.xml
<!--开启组件扫描-->
<context:component-scan base-package="com.atguigu"></context:component-scan>
<!-- 装配视图解析器
配置视图
前缀: /WEB-INF/pages/
后缀: .html
-->
<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
<!--设置UTF-8字符集-->
<property name="characterEncoding" value="UTF-8"></property>
<!--配置模板引擎属性-->
<property name="templateEngine">
<!--配置内部bean-->
<bean class="org.thymeleaf.spring5.SpringTemplateEngine">
<!--配置模块的解析器属性-->
<property name="templateResolver">
<!--配置内部bean-->
<bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
<!--配置前缀-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--配置后缀-->
<property name="suffix" value=".html"></property>
<!--配置字符集-->
<property name="characterEncoding" value="UTF-8"></property>
</bean>
</property>
</bean>
</property>
</bean>
⑤编写请求处理器【Controller | Handler】
@Controller //springMVC中装配控制器,只能用controller
public class HelloController {
@RequestMapping("/index.html")
public String toIndex(){
return "index";
}
⑥编写index.xml
<!DOCTYPE html>
<html lang="en"xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h2>首页</h2>
<a th:href="@{/helloController}">helloController</a>
</body>
</html>
⑦测试
3、基本工作原理
①发送请求:<a th:href="@{/helloController}">helloController</a>
②通过前端控制器【DispatcherServlet】,将请求委托给请求处理器【controller】
③调用业务代码,返回数据模型【视图对象】,springMVC底层最终封装为ModelAndView
④通过前端控制器【DispatcherServlet】将ModelAndView中的View对象解析出来
⑤做出响应【路径跳转(转发 | 重定向)】
4、@RequestMapping注解书写位置
①书写在类上面:不能单独使用,需要配合方法使用;②相当于将所有方法路径,提取到类中
②书写在方法上面:可以单独使用,为指定方法映射URL
5、@RequestMapping注解中的属性
value属性:String[]类型 , 用来设置要映射的请求地址
path属性:String[]类型 , 用来设置要映射的请求地址
method属性:RequestMethod[]枚举类型,设置当前方法的请求方【GET|POST|PUT|DELETE】
/**
* 测试method
* @return
*/
@RequestMapping(value = "/testMethod",method = RequestMethod.GET)
public String testMethod(){
System.out.println("testMethod");
return "success";
}
如请求方式不支持,会报错:405
params属性:String[]类型,设置当前方法的请求参数【必须携带指定参数,才可以访问当前方法,如未携带指定参数会报错,400】
header属性:String[]类型,设置当前方法的请求头信息【必须携带指定请求头,如未携带指定请求头,会报错:404】
6、@PathVariable注解
将占位符中参数,注入处理请求方法的形参中,要求参数名一致
属性:
-
value:设置入参参数名
-
name:与value作用一致
-
required:设置当前参数是否必须入参
-
true:必须入参,如不入参会报错:500
-
false:不必须入参,如不入参不会报错,会将null值注入
-
二、REST风格
(1)REST_CRUD的URL风格与传统CRUD的URL风格对比
总结:REST风格CRUD优势
① 提高网站排名
② 便于第三方平台对接
③HTTP协议底层支持,效率高
(2)注册HiddenHttpMethodFilter过滤器
<!-- 配置HiddenHttpMethodFilter过滤器,目的是为了将POST请求转换为PUT或DELETE请求-->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>REST练习</title>
</head>
<body>
<h2>查询book信息</h2>
<a th:href="@{/RestController}">RestController_查询book信息</a>
<h2>新增book信息</h2>
<form th:action="@{/RestController}" method="post">
<input type="submit">
</form>
<h2>修改book信息</h2>
<form th:action="@{/RestController}" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit">
</form>
<h2>删除book信息</h2>
<form th:action="@{/RestController}" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit">
</form>
</body>
</html>
@Controller
public class RestController {
/**
* 查询book信息
* @return
*/
@RequestMapping(value = "/RestController",method = RequestMethod.GET)
public String getBook(){
System.out.println("查询Book信息...");
return "success";
}
/**
* 新增book信息
* @return
*/
@RequestMapping(value = "/RestController",method = RequestMethod.POST)
public String addBook(){
System.out.println("新增Book信息...");
return "success";
}
/**
* 修改book信息
* @return
*/
@RequestMapping(value = "/RestController",method = RequestMethod.PUT)
public String updateBook(){
System.out.println("修改Book信息...");
return "success";
}
/**
* 删除book信息
* @return
*/
@RequestMapping(value = "/RestController",method = RequestMethod.DELETE)
public String deleteBook(){
System.out.println("删除Book信息...");
return "success";
}
}
三、SpringMVC处理请求数据
1、JavaWeb阶段【Servlrt中处理请求数据-request】
(1)获取请求参数
request.getParameter();
request.getParameterValues();
request.getParameterMap();
(2)获取请求头: request.getHeader();
(3)获取请求行【请求方式、url】
request.getMethod();
request.getRequestURI();
request.getRequestURL();
request.getCookies();
2、SpringMVC处理请求参数
默认情况:当参数与处理方法中形参名一致时,SpringMVC可以实现自动入参
(1)@RequestParam注解
value:设置入参参数名
name:与value属性作用一致
required:设置当前参数,是否必须入参
true:【默认值】必须入参,如未入参会报错:400
false:不必须入参,如未入参,会将null值注入【建议使用包装类】
defaultValue:设置默认值,只要未入参,就会为指定参数设置默认值
3、SpringMVC使用POJO入参
必须保证请求参数名与POJO属性名保持一致,支持级联属性入参
public class Emp {
private Integer empId;
private String empName;
private Double salary;
private Dept dept;
//....
}
public class Dept {
private Integer id;
private String deptName;
//...
}
@RequestMapping("/addEmp")
public String addEmp(Emp emp){
System.out.println("emp = " + emp);
return "success";
}
<h2>添加员工信息</h2>
<form th:action="@{/addEmp}" method="post">
员工id:<input type="text" name="empId"><br>
员工姓名:<input type="text" name="empName"><br>
员工薪资:<input type="text" name="salary"><br>
员工部门ID:<input type="text" name="dept.id"><br>
员工部门名称:<input type="text" name="dept.deptName"><br>
<input type="submit" value="提交员工">
</form>
4、SpringMVC获取请求头 @RequestHeader
SpringMVC获取CookieValue @CookieValue
属性:
-
value:设置获取CookieValue参数名称
-
name:与value作用一致
-
required:设置当前CookieValue是否必须入参
-
true【默认值】:必须入参
-
false:不必须入参
-
-
defaultValue:设置默认值
-
如有未入参CookieValue,则设置当前默认值
-
5、SpringMVC中解决【请求与响应】乱码问题
(1)JavaWeb中解决乱码
request.setCharacterEncoding("UTF-8")
response.setContentType("text/html;charset=UTF-8")
(2)如有其它过滤器一同使用时,需要将CharacterEncodingFilter注册在第一位置
<!-- 注册CharacterEncodingFilter,解决请求与响应乱码-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
<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>
四、SpringMVC中处理响应数据
(1)JavaWeb响应数据基本数据流程
将数据共享到域中:pageContext、request:请求域、session:会话域、 applicationServletContext】
跳转路径:
转发:request.getDispatchServlet(url).forwaard(request,response)
重定向:response.sendRedirect(url)
(2)SpringMVC处理响应数据
使用ModelAndView作为方法返回值类型,处理响应数据
使用Model或Map或ModelMap作为方法参数入参,处理响应数据
@Controller
public class ResponseDataController {
/**
* 使用“ModelAndView”作为方法返回值类型,处理响应数据
* @return
*/
@RequestMapping("/responsedata")
public ModelAndView testResponseDataMV(){
ModelAndView mv = new ModelAndView();
//为mv设置数据模型
mv.addObject("deptId",1001);
mv.addObject("deptName","秘书部门");
//为mv设置视图对象
mv.setViewName("success");
return mv;
}
/**
* 使用“Model”或“Map”或“ModelMap”作为方法参数入参,处理响应数据
*/
@RequestMapping("/responsedataMap")
public String testresponseDataMap(/*Map map*/Model model){
//将数据共享域中【map】
Emp emp = new Emp();
emp.setEmpId(101);
emp.setEmpName("张三");
emp.setSalary(15000.0);
emp.setDept(new Dept(1001,"研发部门"));
//map.put("emp",emp);
model.addAttribute("emp",emp);
return "success";
}
@RequestMapping("/responsedataRedirect")
public String testresponsedataRedirect(HttpServletResponse response){
response.setContentType("test/html;charset=UTF-8");
System.out.println("重定向...");
return "redirect:/target.html";
}
}
五、视图和视图解析器对象
视图对象【View】:将数据共享到域中,跳转路径
视图解析器对象【ViewResolver】:将视图对象从ModelAndView中解析出来
1、mvc:view-controller标签
作用:匹配请求路径与逻辑视图名【如不需要处理业务,只希望跳转路径时,使用该标签】
注意:如添加当前标签,会导致@RequestMapping注解失效,此时需要添加如下标签解决问题:
<mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!-- 解决静态资源加载问题-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!-- 解决静态资源加载、view-controller后续问题等-->
<mvc:annotation-driven></mvc:annotation-driven>