Springmvc是什么:
Springmvc是spring框架的后续产品,用在基于MVC的表现层开发,类似于struts2框架。
Spring全家桶
SSM+SpringBoot+IDEA+Git+SpringCloud+Redis+Vue
Springmvc依赖于Core(IOC),Springmvc需要导入Core包和Springmvc特有的包。
如果使用Spring的DAO、ORM不但要导入这两个包,好如要导入AOP。
Spring全家桶
Demo:
1、导入Springmvc相关的jar包。
2、在/WEB-INF/web.xml文件中:
<!-- 配置DispatcherServlet(前端控制器) -->
<
servlet
>
<
servlet-name
>
springmvc
</
servlet-name
>
<
servlet-class
>org.springframework.web.servlet.DispatcherServlet
</
servlet-class
>
<
init-param
>
<
param-name
>contextConfigLocation
</
param-name
>
<!--
classpath
:代表就是
src
这个路径 -->
<
param-value
>classpath:springmvc.xml
</
param-value
>
</
init-param
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
springmvc
</
servlet-name
>
<!-- /student.action /user.action
所有以action结尾的请求都交给DispatcherServlet来处理
-->
<
url-pattern
>*.action
</
url-pattern
>
</
servlet-mapping
>
3、创建student_insert.jsp和student_info.jsp:
<
form
action=
"${pageContext.request.contextPath}
/student/insert.action"
method=
"post"
>
姓名:
<
input
type=
"text"
name=
"name"
/><
br
/>
年龄:
<
input
type=
"text"
name=
"age"
/><
br
/>
性别:
<
input
type=
"text"
name=
"gender"
/><
br
/>
<
input
type=
"submit"
value=
"提交"
/>
</
form
>
student_info.jsp
<
body
>
student_info.jsp
<
br
/>
${student}
</
body
>
4、创建StudentController.java控制器
@Controller
// 请求映射,怎么样找到这些请求的路径 /student/insert.action
@RequestMapping(value =
"/student")
public
class StudentController {
@RequestMapping(value =
"/insert1")
public
void insert1(String
name, Integer
age, String
gender) {
System.
out.println(
"StudentController.insert()");
System.
out.println(
"name: " +
name);
System.
out.println(
"age: " +
age);
System.
out.println(
"gender: " +
gender);
}
@RequestMapping(value =
"/insert")
public
ModelAndView insert(Student
student) {
System.
out.println(
"StudentController.insert()");
System.
out.println(
student);
// Model:数据 View:界面
ModelAndView
modelAndView =
new ModelAndView();
// request.setAttribute("student", student);
modelAndView.addObject(
"student",
student);
// request.getRequestDispatcher("/student_info.jsp").forward(request,response);
modelAndView.setViewName(
"/student_info.jsp");
return
modelAndView
;
}
}
5、SpringMVC的核心配置文件
ModelAndView和Model:
ModelAndView:即放数据,也放转发的页面
Model:只放数据,以方法返回值形式设置转发的页面
@RequestMapping(
"/insert2")
public ModelAndView insert2(Student
student) {
System.
out.println(
"StudentController.insert2()");
System.
out.println(
student);
// req.setAttritbu("student", student);
// req.getRequestDispatcher("/student_info.jsp").
forword
(
req
,
resp
);
ModelAndView
modelAndView =
new ModelAndView();
modelAndView.addObject(
"student",
student);
modelAndView.setViewName(
"/student_info.jsp");
return
modelAndView;
}
@RequestMapping(
"/insert3")
public String insert3(Student student, Model model) {
System.out.println(
"StudentController.insert3()");
System.out.println(student);
// req.setAttritbu("student", student);
model.addAttribute(
"student", student);
// req.getRequestDispatcher("/student_info.jsp").forword(req, resp);
return
"/student_info.jsp";
}
可以限定某个业务控制方法,只允许GET或者POST方式请求访问:
在业务控制方法中可以写入request、response等传统web参数:
@RequestMapping(value =
"/insert", method = RequestMethod.
POST)
public
void insert(HttpServletRequest
request, HttpServletResponse
response, HttpSession
session)
throws ServletException, IOException {
System.
out.println(
"StudentController.insert()");
String
name =
request.getParameter(
"name");
String
age =
request.getParameter(
"age");
String
gender =
request.getParameter(
"gender");
Student
student =
new Student(
name, Integer.
parseInt(
age),
gender);
request.setAttribute(
"student",
student);
request.getRequestDispatcher(
"/student_info.jsp").forward(
request,
response);
}
在业务逻辑中收集数组:
<
form
action=
"${pageContext.request.contextPath}
/student/deleteAll.action"
>
<
table
border=
"1"
>
<
tr
>
<
th
>编号
</
th
>
<
th
>姓名
</
th
>
</
tr
>
<
tr
>
<
td
><
input
type=
"checkbox"
name
=
"ids"
value=
"1"
/></
td
>
<
td
>张三
</
td
>
</
tr
>
<
tr
>
<
td
><
input
type=
"checkbox"
name
=
"ids"
value=
"2"
/></
td
>
<
td
>李四
</
td
>
</
tr
>
<
tr
>
<
td
><
input
type=
"checkbox"
name
=
"ids"
value=
"3"
/></
td
>
<
td
>王五
</
td
>
</
tr
>
<
tr
>
<
td
><
input
type=
"checkbox"
name
=
"ids"
value=
"4"
/></
td
>
<
td
>赵六
</
td
>
</
tr
>
<
tr
>
<
td
colspan=
"2"
><
input
type=
"submit"
value=
"提交"
/></
td
>
</
tr
>
</
table
>
</
form
>
Request URL:http://localhost:8080/SpringMVC/student/deleteAll.action?
ids=1&ids=2&ids=4
乱码问题:
在传统JSP+Servlet中我们自己写Filter来处理乱码问题,使用SpringMVC他帮我们写了一个处理乱码问题的Filter,我们只需要在web.xml中配置这个Filter就可以了。
在web.xml中添加
<!-- 解决POST乱码问题 -->
<
filter
>
<
filter-name
>characterEncoding
</
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
>characterEncoding
</
filter-name
>
<
url-pattern
>/*
</
url-pattern
>
</
filter-mapping
>
转发和重定向:
// /SpringMVC/student/deleteById.action?id=3
@RequestMapping(
"/deleteById")
public String deleteById(Integer
id) {
System.
out.println(
"StudentController.deleteById()");
System.
out.println(
"id: " +
id);
// response.sendRedirect("/JavaSpringMVC/student/selectAll.action");
return
"redirect:/student/selectAll.action";
}
JSON数据封装:
1、加入Jackson相关jar包
2、在返回方法的时候加上@ResponseBody
@RequestMapping(
"/selectById")
@ResponseBody
public Student selectById(Integer
id){}
@
RequestMapping(
"/select")
@ResponseBody
public List<Student> select(){}
@RequestParam注解
我们一般使用的参数绑定都有遵循的规则:方法参数名要与传递过来的name属性名相同。
在默认的情况下,只有名字相同,SpringMVC才会帮我们进行参数绑定…
如果我们使用@RequestParam注解的话,我们就可以使方法参数名与传递过来的name属性名不同…
该注解有三个变量
value【指定name属性的名称是什么】
/SpringMVC/student/selectByPage.action?
pageNo=3&pageSize=34
public
void
selectByPage(
@RequestParam
(value =
"
page
"
, defaultValue =
"1"
) Integer
pageNo
,
Integer
pageSize
)
required 代表这个参数必须要传递过来,原来不传默认是null,加了这个required 后不传就会报错
defaultvalue设置默认值
/SpringMVC/student/deleteById1/12.action
@PathVariable
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
@RequestMapping(value =
"/deleteById/{id}", method = RequestMethod.
GET)
public
void deleteById(
@PathVariable(
"id") Long
id) {
System.
out.println(
id);
}
视图解析器:
<!-- 视图解析器
1、如果Controller中书写的是视图的逻辑名,这个视图解析器必须要配置。
前缀+视图逻辑名+后缀=真实路径
/
jsp
/ + student_insert + .
jsp
2、如果视图解析器书写的是视图的真实路径,那么这个视图解析器可以不配置
-->
<
bean
class=
"org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<!-- 路径前缀 -->
<
property
name=
"prefix"
value=
"/jsp/"
/>
<!-- 路径后缀 -->
<
property
name=
"suffix"
value=
".jsp"
></
property
>
</
bean
>
拦截器:
Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行
预处理和后处理。
常见应用场景
1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计等。
2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;
3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间
…………本质也是AOP(面向切面编程),也就是说符合横切关注点的所有功能都可以放入拦截器实现。
springmvc.xml:
<!-- 配置拦截器 -->
<
mvc:interceptors
>
<
mvc:interceptor
>
<
mvc:mapping
path=
"/**"
/>
<
bean
class=
"com.situ.mvc.interceptor.MyInterceptor1"
/>
</
mvc:interceptor
>
<
mvc:interceptor
>
<
mvc:mapping
path=
"/**"
/>
<
bean
class=
"com.situ.mvc.interceptor.MyInterceptor2"
/>
</
mvc:interceptor
>
</
mvc:interceptors
>
MyInterceptor1.preHandle()
StudentController.selectAll()
MyInterceptor1.postHandle()
MyInterceptor1.afterCompletion()
MyInterceptor1.preHandle()
MyInterceptor2.preHandle()
StudentController.selectAll()
MyInterceptor2.postHandle()
MyInterceptor1.postHandle()
MyInterceptor1.afterCompletion()
MyInterceptor1.afterCompletion()