wordpress小说下载站,做箱包外贸哪个网站好,wordpress的上传大小,有哪些建设网站的大公司Java SSM篇5——SpringMVC
1、MVC模式
MVC是软件工程中的一种软件架构模式#xff0c;它是一种分离业务逻辑与显示界面的开发思想
M#xff08;model#xff09;模型#xff1a;处理业务逻辑#xff0c;封装实体V#xff08;view#xff09; 视图#xff1a;展示内容…Java SSM篇5——SpringMVC
1、MVC模式
MVC是软件工程中的一种软件架构模式它是一种分离业务逻辑与显示界面的开发思想
Mmodel模型处理业务逻辑封装实体Vview 视图展示内容Ccontroller控制器负责调度分发1.接收请求、2.调用模型、3.转发到视图 2、SpringMVC优点
轻量级简单易学高效 , 基于请求响应的MVC框架与Spring兼容性好无缝结合约定优于配置功能强大RESTful、数据验证、格式化、本地化、主题等简洁灵活
3、SpringMVC快速入门
导入依赖
dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.6/version/dependencydependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/version/dependencydependencygroupIdjavax.servlet.jsp/groupIdartifactIdjavax.servlet.jsp-api/artifactIdversion2.3.3/version/dependency
/dependencies在web.xml注册DispatcherServlet
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--注册DispatcherServlet--servletservlet-namespringmvc/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc-config.xml/param-value/init-paramload-on-startup1/load-on-startup/servlet!--/ 匹配所有的请求不包括.jsp--!--/* 匹配所有的请求包括.jsp--servlet-mappingservlet-namespringmvc/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-appspringmvc核心配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd!-- 自动扫描包让指定包下的注解生效,由IOC容器统一管理 --context:component-scan base-packagecn.winkto.controller/!-- 让Spring MVC不处理静态资源 --mvc:default-servlet-handler /!--处理器映射器和处理器适配器,以及功能增强--mvc:annotation-driven /!-- 视图解析器 --bean classorg.springframework.web.servlet.view.InternalResourceViewResolveridinternalResourceViewResolver!-- 前缀 --property nameprefix value/WEB-INF/jsp/ /!-- 后缀 --property namesuffix value.jsp //bean/beans第一个controller
Controller
public class HelloController {RequestMapping(/hello)public String hello(){System.out.println(hello);return hello;}
}hello.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
h1Hello, i am winkto!/h1
/body
/html错误分析web项目下没有lib包或者包不全
4、Spring执行流程 5、SpringMVC组件详解
前端控制器DispatcherServlet 用户请求到达前端控制器它就相当于 MVC 模式中的 CDispatcherServlet 是整个流程控制的 中心由它调用其它组件处理用户的请求DispatcherServlet 的存在降低了组件之间的耦合性处理器映射器HandlerMapping HandlerMapping 负责根据用户请求找到 Handler 即处理器SpringMVC 提供了不同的映射器 实现不同的映射方式例如配置文件方式实现接口方式注解方式等处理器适配器HandlerAdapter 通过 HandlerAdapter 对处理器进行执行这是适配器模式的应用通过扩展适配器可以对更多类型 的处理器进行执行处理器Handler【开发者编写】 它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理视图解析器ViewResolver View Resolver 负责将处理结果生成 View 视图View Resolver 首先根据逻辑视图名解析成物 理视图名即具体的页面地址再生成 View 视图对象最后对 View 进行渲染将处理结果通过页面展示给 用户视图View 【开发者编写】 SpringMVC 框架提供了很多的 View 视图类型的支持包括jstlView、freemarkerView、 pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展 示给用户需要由程序员根据业务需求开发具体的页面
6、SpringMVC请求
基本类型参数对象类型参数数组类型参数集合类型参数
6.1、基本类型参数
参数名称与请求参数的name一致参数值会自动映射匹配
RequestMapping(/parameter1)
ResponseBody
public String parameter1(int id, String name){return idname;
}http://localhost:8080/springmvc_war_exploded/parameter1?id1namezhangsan6.2、对象类型参数
实体类属性名与请求参数的name一致参数值会自动映射匹配
public class Person {private int id;private String name;private String password;
}RequestMapping(/parameter2)
ResponseBody
public String parameter2(Person person){return person.toString();
}
http://localhost:8080/springmvc_war_exploded/parameter2?id2namelisipasswordblingbling
6.3、数组类型参数
数组名称与请求参数的name一致参数值会自动映射匹配
RequestMapping(/parameter3)
ResponseBody
public String parameter3(String[] hobits){return Arrays.toString(hobits);
}
http://localhost:8080/springmvc_war_exploded/parameter3?hobitsBasketballhobitsFootball
6.4、集合类型参数
public class Paramater {private ListPerson people;private Person person;
}
RequestMapping(/parameter4)
ResponseBody
public String parameter4(Paramater paramater){return paramater.toString();
}
% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitle$Title$/title/headbodyform action${pageContext.request.contextPath}/parameter4 methodpostlist集合br第一个元素input typetext namepeople[0].id placeholder编号input typetext namepeople[0].name placeholder姓名input typetext namepeople[0].password placeholder密码br第二个元素input typetext namepeople[1].id placeholder编号input typetext namepeople[1].name placeholder姓名input typetext namepeople[1].password placeholder密码brpersoninput typetext nameperson.id placeholder编号input typetext nameperson.name placeholder姓名input typetext nameperson.password placeholder密码brinput typesubmit value提交/form/body
/html
6.5、中文乱码
6.5.1、GET 方式请求出现的中文乱码
使用 String 的getBytes(“ISO-8859-1”)方法先转换为 byte[] 再创建一个String,既 String namenew String(bytes,”UTF-8”);
6.5.2、POST 方式请求出现的中文乱码
!-- 配置编码过滤 --
filterfilter-nameEncoidingFilter/filter-namefilter-classcn.winkto.controller.EncoidingFilter/filter-classinit-paramparam-nameEncoding/param-nameparam-valueutf-8/param-value/init-param
/filterfilter-mappingfilter-nameEncoidingFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping
6.6、自定义类型转换
6.6.1、日期类型转换
RequestMapping(/parameter5)
ResponseBody
public String parameter5(Date date){return date.toString();
}
form action${pageContext.request.contextPath}/parameter5 methodpostinput typetext namedateinput typesubmit value提交
/form
2020/02/02
Sun Feb 02 00:00:00 CST 2020
以/分割确实没有什么问题但是一旦使用-分割就出现错误
6.6.2、自定义类型转换
自定义转换器
public class DateConverter implements ConverterString, Date {public Date convert(String s) {SimpleDateFormat simpleDateFormatnew SimpleDateFormat(yyyy-MM-dd HH:mm:ss);try {return simpleDateFormat.parse(s);} catch (ParseException e) {e.printStackTrace();}return null;}
}
配置转换器
bean idconverter classorg.springframework.context.support.ConversionServiceFactoryBeanproperty nameconverterssetbean classcn.winkto.converter.DateConverter //set/property
/bean
启动转换器
mvc:annotation-driven conversion-serviceconverter /
测试
2020-02-02 10:19:00
Sun Feb 02 10:19:00 CST 2020
6.7、RequestParam
当请求的参数name名称与Controller的业务方法参数名称不一致时就需要通过RequestParam注 解显示的绑定
RequestMapping(/parameter6)
ResponseBody
public String parameter6(RequestParam(value a,defaultValue 0,required false) int id){return id;
}
http://localhost:8080/springmvc_war_exploded/parameter6
0
http://localhost:8080/springmvc_war_exploded/parameter6?a1
1
6.8、RequestHeader、CookieValue
RequestMapping(/parameter7)
ResponseBody
public String parameter7(RequestHeader(cookie) String cookie){return cookie;
}
RequestMapping(/parameter8)
ResponseBody
public String parameter8(CookieValue(JSESSIONID) String JSESSIONID){return JSESSIONID;
}
6.9、原生servlet的获取
RequestMapping(/parameter9)
ResponseBody
public String parameter9(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, HttpSession httpSession){System.out.println(httpServletRequest);System.out.println(httpServletResponse);System.out.println(httpSession);return servlet;
}
7、SpringMVC响应
7.1、页面跳转
7.1.1、返回字符串逻辑视图
RequestMapping(/hello)
public String hello(){return hello;
}
7.1.2、原始ServletAPI
RequestMapping(/hello1)
public void hello1(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws ServletException, IOException {httpServletRequest.getRequestDispatcher(/WEB-INF/jsp/hello.jsp).forward(httpServletRequest,httpServletResponse);
}
RequestMapping(/hello2)
public void hello2(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws ServletException, IOException {httpServletResponse.sendRedirect(httpServletRequest.getContextPath()/hello);
}
7.1.3、ModelAndView
RequestMapping(/hello3)
public ModelAndView hello(ModelAndView modelAndView) {modelAndView.setViewName(hello);return modelAndView;
}
7.2、返回数据
RequestMapping(/hello4)
ResponseBody
public String hello4() {return hello;
}
7.3、 转发和重定向
7.3.1、原始ServletAPI
RequestMapping(/hello1)
public void hello1(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws ServletException, IOException {httpServletRequest.getRequestDispatcher(/WEB-INF/jsp/hello.jsp).forward(httpServletRequest,httpServletResponse);
}
RequestMapping(/hello2)
public void hello2(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) throws ServletException, IOException {httpServletResponse.sendRedirect(httpServletRequest.getContextPath()/hello);
}
7.3.2、springmvc
RequestMapping(/hello5)
public String hello5() {return forward:/WEB-INF/jsp/hello.jsp;
}
RequestMapping(/hello6)
public String hello6() {return redirect:/hello;
}
7.4、SessionAttributes
如果在多个请求之间共用数据则可以在控制器类上标注一个 SessionAttributes,配置需要在 session中存放的数据范围Spring MVC将存放在model中对应的数据暂存到 HttpSession 中只能放置在控制器类上
7.5、静态资源访问的开启
7.5.1、处理1
mvc:resources mapping/js/** location/js//
7.5.2、处理2
mvc:default-servlet-handler/
8、ResponseBody
用于将Controller的方法返回的对象通过HttpMessageConverter接口转换为指定格式的数 据如json,xml等通过Response响应给客户端
9、RestFul
Restful是一种软件架构风格、设计风格而不是标准只是提供了一组设计原则和约束条件。主要用 于客户端和服务器交互类的软件基于这个风格设计的软件可以更简洁更有层次更易于实现缓存机 制等。 Restful风格的请求是使用“url请求方式”表示一次请求目的的
9.1、方式对比
传统方式
http://127.0.0.1/item/queryItem.action?id1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id1 删除,GET或POST
RestFul风格
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
9.2、Restful的好处
使路径变得更加简洁获得参数更加方便框架会自动进行类型转换通过路径变量的类型可以约束访问参数如果类型不一样则访问不到对应的请求方法如这里访问是的路径是/commit/1/a则路径与方法不匹配而不会是参数转换失败
9.3、Restful的使用
GetMappingPostMappingPutMappingDeleteMappingPatchMapping
//基本类型
GetMapping(/restful1/{a})
ResponseBody
public String restful1(PathVariable int a) {return a;
}
//对象类型
GetMapping(/restful2/{id}/{name}/{password})
ResponseBody
public String restful2(Person person) {return person.toString();
}
http://localhost:8080/springmvc_war_exploded/restful1/1
http://localhost:8080/springmvc_war_exploded/restful2/1/zhangsan/lisi
10、文件
10.1、文件上传三要素
表单项 type“file”表单的提交方式 method“POST”表单的enctype属性是多部分表单形式 enctype“multipart/form-data
10.2、文件上传原理
当form表单修改为多部分表单时request.getParameter()将失效当form表单的enctype取值为 application/x-www-form-urlencoded 时 form表单的正文内容格式是 namevaluenamevalue当form表单的enctype取值为 mutilpart/form-data 时请求正文内容就变成多部分形式
10.3、文件上传的实现
导入依赖
dependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion1.4/version
/dependency
配置文件上传解析器
bean idmultipartResolver classorg.springframework.web.multipart.commons.CommonsMultipartResolverproperty namedefaultEncoding valueutf-8/property!-- 设定文件上传的最大值为5MB5*1024*1024 --property namemaxUploadSize value5242880/property!-- 设定文件上传时写入内存的最大值如果小于这个参数不会生成临时文件默认为10240 --property namemaxInMemorySize value40960/property
/bean
配置接口
Controller
public class FileLoad {//传统方式RequestMapping(/upload)public String upload(RequestParam(file) CommonsMultipartFile file, HttpServletRequest request) throws IOException {String filename file.getOriginalFilename();if (.equals(filename)){return redirect:/index.jsp;}System.out.println(filename);String pathrequest.getServletContext().getRealPath(upload);File file1new File(path);if (!file1.exists()){file1.mkdir();}System.out.println(path);InputStream inputStreamfile.getInputStream();OutputStream outputStreamnew FileOutputStream(new File(path,filename));int len0;byte[] bytes new byte[1024];while ((leninputStream.read(bytes))!-1){outputStream.write(bytes,0,len);outputStream.flush();}inputStream.close();outputStream.close();System.out.println(ok);return redirect:/index.jsp;}//springmvc方式RequestMapping(upload1)public String upload1(RequestParam(file) CommonsMultipartFile file, HttpServletRequest request) throws IOException {String pathrequest.getServletContext().getRealPath(upload);File file1new File(path);if (!file1.exists()){file1.mkdir();}System.out.println(path);file.transferTo(new File(path/file.getOriginalFilename()));return redirect:/index.jsp;}
}
jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitle$Title$/title/headbodyform action${pageContext.request.contextPath}/upload methodpost enctypemultipart/form-datainput typefile namefileinput typesubmit valueSubmit/form/body
/html
10.4、文件下载
接口
Controller
public class FileLoad {RequestMapping(/download)public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{//要下载的图片地址String path request.getServletContext().getRealPath(/upload);String fileName 1.png;//1、设置response 响应头response.reset(); //设置页面不缓存,清空bufferresponse.setCharacterEncoding(UTF-8); //字符编码response.setContentType(multipart/form-data); //二进制传输数据//设置响应头response.setHeader(Content-Disposition,attachment;fileName URLEncoder.encode(fileName, UTF-8));File file new File(path,fileName);//2、 读取文件--输入流InputStream inputnew FileInputStream(file);//3、 写出文件--输出流OutputStream out response.getOutputStream();byte[] buff new byte[1024];int index0;//4、执行 写出操作while((index input.read(buff))! -1){out.write(buff, 0, index);out.flush();}out.close();input.close();return null;}
}
jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitle$Title$/title/headbodya href${pageContext.request.contextPath}/download1.png/a/body
/html
11、拦截器
Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter用于对处理器进行预处理和后处理
11.1、拦截器与过滤器的比对
区别过滤器拦截器使用范围任何java web项目只有springmvc项目才可以使用拦截范围url-paten配置了/*后可以对所有资源进行拦截只会拦截控制器方法
11.2、拦截器快速入门
书写拦截器实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(方法前);return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(方法后);}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(清理操作);}
}
springmvc核心配置文件配置拦截器
mvc:interceptorsmvc:interceptor!--/** 包括路径及其子路径--!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--!--/admin/** 拦截的是/admin/下的所有--mvc:mapping path/**/!--bean配置的就是拦截器--bean classcn.winkto.controller.MyInterceptor//mvc:interceptor
/mvc:interceptors
11.3、拦截器链
开发中拦截器可以单独使用也可以同时使用多个拦截器形成一条拦截器链。开发步骤和单个拦截器 是一样的只不过注册的时候注册多个注意这里注册的顺序就代表拦截器执行的顺序
书写拦截器实现HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(方法前);return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(方法后);}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(清理操作);}
}
public class MyInterceptor1 implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(方法前);return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(方法后);}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(清理操作);}
}
springmvc核心配置文件配置拦截器
mvc:interceptorsmvc:interceptor!--/** 包括路径及其子路径--!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--!--/admin/** 拦截的是/admin/下的所有--mvc:mapping path/**/!--bean配置的就是拦截器--bean classcn.winkto.controller.MyInterceptor//mvc:interceptormvc:interceptormvc:mapping path/**/!--bean配置的就是拦截器--bean classcn.winkto.controller.MyInterceptor1//mvc:interceptor
/mvc:interceptors
12、异常处理
12.1、异常处理思路
当前方法捕获处理try-catch这种处理方式会造成业务代码和异常处理代码的耦合自己不处理而是抛给调用者处理throws调用者再抛给它的调用者也就是一直向上抛
在这种方法的基础上衍生出了SpringMVC的异常处理机制系统的mapper、service、controller出现都通过throws Exception向上抛出最后由springmvc前端控 制器交由异常处理器进行异常处理 12.2、自定义异常处理
编写自定义异常处理器继承HandlerExceptionResolver接口书写页面跳转并注入容器
Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {System.out.println(发生异常了e);ModelAndView modelAndView new ModelAndView();modelAndView.setViewName(error);return modelAndView;}
}
异常页面
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
h1Error/h1
/body
/html测试
RequestMapping(/hello)
public String hello(){throw new RuntimeException(啦啦啦);
}12.3、web的处理异常机制
web.xml
!--处理500异常--
error-pageerror-code500/error-code!--路径以web目录为基准--location/500.jsp/location
/error-page
!--处理404异常--
error-pageerror-code404/error-code!--路径以web目录为基准--location/404.jsp/location
/error-page