SpringMVC
1 概述
1.1 MVC是什么
M:model模型 JavaBean
V:view视图 JSP
C:Controller控制器 Servlet
1.2 SpringMVC与Struts2的优劣分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r2XsA3XD-1603038932970)(D:\Study\笔记\图\image-20201014200726325.png)]
2 程序的基本流程
2.1 入门配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-flkRuS9M-1603038932973)(D:\Study\笔记\图\image-20201015131115992.png)]
2.2 基本执行流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zruPRGRV-1603038932975)(D:\Study\笔记\图\image-20201015131339691.png)]
2.3 基本组件
DispatcherServlet:前端控制器,是整个流程控制的中心,由它调用其它组件处理用户的请求,它的存在降低了组件之间的耦合性
HandlerMapping:处理器映射器,负责根据用户请求找到Handler即处理器。
Handler:处理器,它就是我们开发中要编写的具体业务控制器,由DispatcherServlet把用户请求转发到Handler。由Handler对具体的用户请求进行处理。
HandlAdapter:处理器适配器
View Resolver:视图解析器,负责将处理结果生成View视图
View:视图
<mvc:annotation-driven>说明:
在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件。 使用<mvc:annotation-driven>自动加载RequestMappingHandlerMapping(处理映射器)和RequestMappingHandlerAdapter(处理适配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driven>替代注解处理器和适配器的配置。
3 基本配置
3.1 bean.xml配置
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast"/>
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven/>
3.2 注解
@Controller:声明该类可以被扫描到
@RequestMapping:声明该方法的路径
将该注解放到类上声明一级目录,放在方法上声明二级目录
属性值:
value(path):资源路径,可以设置成path也可以设置成value
method={}:指定请求方式
params={}:指定限制请求参数的条件,支持简单的表达式,要求请求参数的
3.3 请求参数的绑定
SpringMVC绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
3.3.1 支持的技术类型
基本类型参数: 包括基本类型和String类型
POJO类型参数: 包括实体类,以及关联的实体类
数组和集合类型参数: 包括List结构和Map结构的集合(包括数组)
3.3.2 使用要求
如果是基本类型或者String类型: 要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
如果是POJO类型,或者它的关联对象: 要求表单中参数名称和POJO类的属性名称保持一致。并且控制器方法的参数类型是POJO类型。
如果是集合类型,有两种方式:
第一种: 要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同。 给List集合中的元素赋值,使用下标。 给Map集合中的元素赋值,使用键值对。
第二种: 接收的请求参数是json格式数据。需要借助一个注解实现。
3.4 其他常用注解
@RequestParam
作用:把请求中指定名称的参数给控制器中的形参赋值。
属性:value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
@RequestBody
作用:用于获取请求体内容。直接使用得到是key=value&key=value…结构的数据。get请求方式不适用。
属性:required:是否必须有请求体。
默认值是:true。当取值为true时,get请求方式会报错。如果取值为false,get请求得到是null。
@PathVaribale
作用:用于绑定url中的占位符。
属性:value:用于指定url中占位符名称。 required:是否必须提供占位符。
@RequestHeader
作用:用于获取请求消息头。
属性:value:提供消息头名称 required:是否必须有此消息头
ps:实际开发不怎么用
@CookieValue
作用:用于把指定cookie名称的值传入控制器方法参数。
属性:value:指定cookie的名称。 required:是否必须有此cookie。
@ModelAttribute
作用:用于修饰方法和参数。
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。
属性:value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
@SessionAttribute
作用:用于多次执行控制器方法间的参数共享。
属性:value:用于指定存入的属性名称 type:用于指定存入的数据类型。
4 响应
4.1 返回值是String
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("美美");
user.setPassword("123");
user.setAge(30);
// model对象
model.addAttribute("user",user);
return "success";
}
4.2 无返回值
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
//System.out.println("testVoid方法执行了");
//编写请求转发的程序
//request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
//重定向
//response.sendRedirect(request.getContextPath()+"index.jsp");
//设置中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//直接会进行相应
response.getWriter().print("你好");
return;
}
4.3 返回ModelAndView
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
//创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("壮壮");
user.setPassword("456");
user.setAge(50);
//把user对象存储到mv对象中,也会把user对象存入到request对象域中
mv.addObject("user",user);
//跳转到哪个页面
mv.setViewName("success");
return mv;
}
4.4 使用关键字的方式进行转发或者重定向
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了...");
//请求的转发
//return "forward:/WEB-INF/pages/success.jsp";
//重定向
return "redirect:/index.jsp";
}
4.5 ResponseBody响应json数据
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟查询数据库
user.setUsername("haha");
user.setAge(40);
// 做响应
return user;
}
5 SpringMVC实现文件上传
5.1 配置文件解析器
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
5.2 代码
@RequestMapping("fileUpLoad2")
public String fileUpLoad2(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("SpringMVC文件上传");
//使用fileupload组件完成文件上传
//上传的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
File file = new File(path);
if (!file.exists()) {
//创建该文件夹
file.mkdirs();
}
//说明上传文件项
//获取上传文件的名称
String filename = upload.getOriginalFilename();
//文件名设置成唯一值
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
//完成文件上传
upload.transferTo(new File(path,filename));
return "success";
}
5.3 跨服务器文件上传
@RequestMapping("/fileupload3")
public String fileuoload3(MultipartFile upload) throws Exception {
System.out.println("跨服务器文件上传...");
// 定义上传文件服务器路径
String path = "http://localhost:9090/uploads/";
// 说明上传文件项
// 获取上传文件的名称
String filename = upload.getOriginalFilename();
// 把文件的名称设置唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
// 创建客户端的对象
Client client = Client.create();
// 和图片服务器进行连接
WebResource webResource = client.resource(path + filename);
// 上传文件
webResource.put(upload.getBytes());
return "success";
}
6 异常处理
6.1 处理异常业务逻辑
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//获取到异常对象
SysException e = null;
if (ex instanceof SysException){
e = (SysException) ex;
}else {
e = new SysException("系统正在维护");
}
//创建ModelAndView对象
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("errorMsg",e.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
6.2 配置异常处理器
<bean id="sysExceptionResolver" class="itcast.exception.SysExceptionResolver"></bean>
7 SpringMVC拦截器
7.1 配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--要拦截的具体的方法-->
<mvc:mapping path="/user/*"/>
<!--不要拦截的方法-->
<!--<mvc:exclude-mapping path=""/>-->
<!--配置拦截器对象-->
<bean class="cn.itcast.interceptor.MyInterceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/user/*"/>
<bean class="cn.itcast.interceptor.MyInterceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
7.2 拦截器类
public class MyInterceptor1 implements HandlerInterceptor {
/**
* 预处理,controller方法执行前
* return true放行,执行下一个拦截器,如果没有就执行controller中的方法
* return false不放行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("MyInterceptor1执行了。。。前111");
return true;
}
/**
* 后处理,controller方法执行后,success.jsp执行前
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor1执行了...后111");
}
/**
* success.jsp页面执行后,该方法会执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1执行了...完111");
}
}
ew) throws Exception {
System.out.println(“MyInterceptor1执行了…后111”);
}
/**
* success.jsp页面执行后,该方法会执行
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor1执行了...完111");
}
}

被折叠的 条评论
为什么被折叠?



