电子商务网站建设课程设计思路,河南县公司网站建设,做网站域名的成本,wordpress如何双语SpringMVC介绍
MVC模型
MVC全称Model View Controller#xff0c;是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分#xff1a;
Model#xff08;模型#xff09;#xff1a;指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用…SpringMVC介绍
MVC模型
MVC全称Model View Controller是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分
Model模型指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中JavaBean对象业务模型等都属于Model。View视图用于展示模型中的数据的一般为jsp或html文件。Controller控制器是应用程序中处理用户交互的部分。接受视图提出的请求将数据交给模型处理并将处理后的结果交 给视图显示。 SpringMVC
SpringMVC是一个基于MVC模式的轻量级Web框架是Spring框架的一个模块和Spring可以直接整合使用使用的版本是 Spring6所以JDK需要17以上。SpringMVC代替了Servlet技术它通过一套注解让一个简单的Java类成为处理请求的控制器而 无须实现任何接口。
SpringMVC入门案例 使用maven创建web项目补齐包结构。 引入相关依赖以及插件
dependencies!-- spring核心依赖--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion6.0.11/version/dependency!-- SpringMVC--dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion6.0.11/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion6.0.11/version/dependency!-- Servlet--dependencygroupIdjakarta.servlet/groupIdartifactIdjakarta.servlet-api/artifactIdversion6.0.0/version
!-- scopeprovided/scope--/dependency!-- JSP--dependencygroupIdjakarta.servlet.jsp/groupIdartifactIdjakarta.servlet.jsp-api/artifactIdversion3.0.0/version
!-- scopeprovided/scope--/dependency!-- Annotation--dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.19/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-war-plugin/artifactIdversion3.3.1/version/plugin/plugins/build在web.xml中配置前端控制器DispatcherServlet。
display-nameArchetype Created web Application/display-name
!-- SpringMVC前端控制器本质是一个Servlet接收所有请求在容器启动时就会加载--servletservlet-namedispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc.xml/param-value/init-paramload-on-startup1/load-on-startup/servletservlet-mappingservlet-namedispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping编写SpringMVC核心配置文件springmvc.xml该文件和Spring 配置文件写法一样。
!-- 扫描包--
context:component-scan base-packagecom.winter/context:component-scan
!-- 开启SpringMVC注解的支持--mvc:annotation-driven /
编写控制器
package com.winter.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;Controller
public class MyController {
//该方法的访问路径是/c1/hello1RequestMapping(/c1/hello1)public void helloMVC(){System.out.println(hello SpringMVC!);}
}
配置tomcat10启动项目访问 http://localhost:8080/c1/hello1
SpringMVC执行流程 SpringMVC的组件
DispatcherServlet前端控制器接受所有请求调用其他组件。HandlerMapping处理器映射器根据配置找到方法的执行链。HandlerAdapter处理器适配器根据方法类型找到对应的处理器。ViewResolver视图解析器找到指定视图。
组件的工作流程
客户端将请求发送给前端控制器。前端控制器将请求发送给处理器映射器处理器映射器根据路径找到方法的执行链返回给前端控制器。前端控制器将方法的执行链发送给处理器适配器处理器适配器根据方法类型找到对应的处理器。处理器执行方法将结果返回给前端控制器。前端控制器将结果发送给视图解析器视图解析器找到视图文件位置。视图渲染数据并将结果显示到客户端。
SpringMVC封装参数_简单数据类型
在Servlet中我们通过 request.getParameter(name) 获取请求参数。该方式存在两个问题
请求参数较多时会出现代码冗余。与容器紧耦合。
SpringMVC支持参数注入的方式用于获取请求数据即将请求参数直接封装到方法的参数当中。用法如下
编写控制器方法 RequestMapping(/c1/param1)public void helloMVC(String username,int age){System.out.println(username);System.out.println(age);}
访问该方法时请求参数名和方法参数名相同即可完成自动封装。
http://localhost:8080/c1/param1?usernamexyyage10SpringMVC封装参数_简单对象
SpringMVC支持将参数直接封装为对象写法如下
编写实体类
public class Student {private int id;private String name;private String gender;//省略getter()/setter()/toString()方法
}编写控制器方法 //封装为简单对象类型参数RequestMapping(/c1/param2)public void objParam(Student student){System.out.println(student);}访问该方法时请求参数名和对象参数的属性名相同即可完成自动封装。
http://localhost:8080/c1/param2?id1namemyysexfemaleSpringMVC封装参数_关联对象
SpringMVC还可以将请求参数封装为关联对象即对象的属性也是一个对象。写法如下
编写实体类
在这里插入代码片编写控制器方法
//获取关联对象类型参数RequestMapping(/c1/param3)public void objParam2(Student student){System.out.println(student);}访问该方法时请求参数名和方法参数的属性名相同即可完成自动封装。
http://localhost:8080/c1/param3?id1namexyysexfemal
eaddress.infograssaddress.postcode030000也可以使用表单发送带有参数的请求 % page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
form action/c1/param3 methodpostid:input nameid姓名:input namename性别:input nameaddress.info邮编:input nameaddress.postcodeinput typesubmit
/form
/body
/htmlSpringMVC封装参数_List集合
SpringMVC支持将请求参数封装为List或Map集合写法如下
封装为简单数据类型集合
编写控制器方法
//封装为简单数据类型集合参数前必须添加RequestParam注解RequestMapping(/c1/param4)public void listParam(RequestParam ListString user){System.out.println(user);}也可以封装为简单数据类型数组
//也可以封装为简单数据类型数组RequestMapping(/c1/param5)public void listParam2(RequestParam String[] users){System.out.println(users[0]);System.out.println(users[1]);}请求的参数写法
http://localhost:8080/c1/param4?usermyyuserxyy封装为对象类型集合
SpringMVC不支持将请求参数封装为对象类型的List集合但可以封装到有List属性的对象中。
编写实体类
public class AddressList {private ListAddress address;编写控制器方法
RequestMapping(/c1/param6)public void listParam3(AddressList addressList){System.out.println(addressList);}请求的参数写法
/*新版Tomcat中URL中的方括号必须编码 [ 使用 %5B 代替 ]使用 %5D 代替所以URL的路径写法如下*/
http://localhost:8080/c1/param6?address%5B0%5D.infohnaddress%5B0%5D.postcode422000address%5B1%5D.infocsaddress%5B1%5D.postcode12332SpringMVC封装参数_Map集合
同样SpringMVC要想把参数封装到Map集合中需要封装到有Map属性的对象中。
编写实体类
public class AddressMap {private MapString,Address address;// 省略getter/setter/tostring编写控制器方法 RequestMapping(/c1/param7)public void mapParam3(AddressMap addressMap){System.out.println(addressMap.getAddress());}请求的参数写法
http://localhost:8080/c1/param6?address%5B0%5D.infohnaddress%5B0%5D.postcode422000address%5B1%5D.infocsaddress%5B1%5D.postcode12332SpringMVC封装参数_参数类型转换器
前端传来的参数全部为字符串类型SpringMVC使用自带的转换器将字符串参数转为需要的类型。如 //获取简单数据类型RequestMapping(/c1/param1)public void simpleParam(String username,int age){System.out.println(username);System.out.println(age);}但在某些情况下无法将字符串转为需要的类型如
RequestMapping(/c1/param8)
public void date(Date date){System.out.println(date);
}由于日期数据有很多种格式SpringMVC默认只能转换 2050/1/1 这样的日期格式。但假如前端传来的参数格式为 2025-01-01 时 SpringMVC就无法解析参数。此时需要自定义参数类型转换器。
定义类型转换器类实现Converter接口
public class DateConverter implements ConverterString, Date {/*** 转换方法* param source 转换前的数据* return 转换后的数据*/Overridepublic Date convert(String source) {SimpleDateFormat simpleDateFormatnew SimpleDateFormat(yyyy-MM-dd);Date datenull;try {datesimpleDateFormat.parse(source);}catch (Exception e){e.printStackTrace();}return date;}
}
注册类型转换器对象
!-- 配置转换器工厂--bean iddataConverter classorg.springframework.context.support.ConversionServiceFactoryBean
!-- 转换器集合--property nameconvertersset
!-- 自定义转换器--bean classcom.winter.converter.DateConverter/bean/set/property/bean
!-- 使用转换器工厂--mvc:annotation-driven conversion-servicedataConverter/mvc:annotation-driven
此时再访问http://localhost:8080/c1/param9?date2025-01-01时SpringMVC即可将请求参数封装为Date类型的参数。
SpringMVC封装参数_编码过滤器 在传递参数时tomcat10以上不会出现中文乱码tomcat8以上能处理get请求的中文乱码但不能处理post请求的中文乱码。
编写jsp表单
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitle编码过滤器/title
/head
body
form action/c1/code methodpost姓名:input namenameinput typesubmit
/form
/body
/html
编写控制器方法 RequestMapping(/c1/code)public void code(String username){System.out.println(username);}SpringMVC提供了处理中文乱码的过滤器在web.xml中配置该过滤器即可解决中文乱码问题 !--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方--filterfilter-nameencFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueutf-8/param-value/init-param/filterfilter-mappingfilter-nameencFilter/filter-nameurl-pattern/*/url-pattern/filter-mappingSpringMVC封装参数_Servlet原生对象
SpringMVC的方法中已经封装好了Servlet原生对象在方法参数中定义 HttpServletRequest、 HttpServletResponse、 HttpSession等类型的参数即可直接在方法中使用。
//使用sevlet原生对象RequestMapping(/c1/param9)public void servletParam(HttpServletRequest request, HttpServletResponse response, HttpSession session){//原生对象获取参数System.out.println(request.getParameter(name));System.out.println(response.getCharacterEncoding());System.out.println(session.getId());}
访问路径为http://localhost:8080/c1/param9?namexy
一般情况下在SpringMVC中都有对Servlet原生对象的方法的替代推荐使用SpringMVC的方式代替Servlet原生对象。
SpringMVC处理响应_视图解析器
SpringMVC默认情况下会在控制器执行完成后跳转到视图页面视图解析器能找到相应的视图之前的404异常就是由于没有配置视图解析器导致找不到视图。
在SpringMVC中提供了13个视图解析器用于支持不同的视图技术。InternalResourceViewResolver是SpringMVC的默认视图解析器用来解析JSP视图。
!--视图解析器--bean idviewReslover classorg.springframework.web.servlet.view.InternalResourceViewResolver
!-- 视图前缀--property nameprefix value//property
!-- 视图后缀--property namesuffix value.jsp/property
/beanSpringMVC处理响应_返回值为void
可以通过控制器方法的返回值设置跳转的视图控制器方法支持的返回值类型为 void、 String、 ModelAndView
前缀方法路径名后缀 的jsp页面
编写控制器方法 //路径是helloMVC方法执行完后会跳转到/helloMVC.jspRequestMapping(/helloMVC)public void helloMVC(){System.out.println(hello SpringMVC!);}编写helloMVC.jsp
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleMVC/title
/head
body
h1欢迎来到SpringMVC/h1
/body
/htmlSpringMVC处理响应_返回值为String
跳转到名字是 前缀返回值后缀 的jsp页面
编写控制器方法
//返回值是StringRequestMapping(/c2/hello)public String helloMVC1(){System.out.println(hello SpringMVC);return helloMVC;}SpringMVC处理响应_返回值为ModelAndView
ModelAndView是SpringMVC提供的对象该对象可以向request域设置数据并指定跳转的页面。该对象中包含Model对象和View对象。
Model向request域中设置数据。View指定跳转的页面。
编写控制器方法 //返回值为ModelAndViewRequestMapping(/c2/hello2)public ModelAndView hello(){System.out.println(返回值类型为ModelAndView);//创建ModelAndView对象ModelAndView modelAndViewnew ModelAndView();//获取Model对象本质是一个MapMapString,Object model1modelAndView.getModel();//使用Model对象向request域设置数据model1.put(name,熊大);//使用View对象设置跳转的路径,该值需要与jsp名字对应上modelAndView.setViewName(ModelAndView);return modelAndView;}编写jsp页面
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleModelAndView/title
/head
bodyh1您好${requestScope.name}/h1
/body
/html
修改web.xml命名空间让jsp页面默认支持el表达式
?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/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsdversion3.1/web-appSpringMVC处理响应_向request域设置数据
当控制器返回值为ModelAndView时我们可以向request域设置数据还有以下方法可以向request域设置数据
使用原生的HttpServletRequest RequestMapping(/c2/hello3)public String setRequestModel(HttpServletRequest request){request.setAttribute(name,熊出没);return ModelAndView;}
使用Model、ModelMap
SpringMVC提供了Model接口和ModelMap类控制器方法添加这两个类型的参数使用该参数设置数据该数据就会存到request域中。 RequestMapping(/c2/hello4)public String setRequestModel2(Model model, ModelMap modelMap){//model.addAttribute(name,蹦蹦);modelMap.addAttribute(name,涂涂);return ModelAndView;}使用Map集合
Model接口底层就是一个Map集合给控制器方法设置Map类型的参数向Map中添加键值对数据也会存到request域中。
RequestMapping(/c2/hello5)public String setRequestModel3(Map map){map.put(name,肥波);return ModelAndView;}
SpringMVC处理响应_向session域设置数据
Session作用域表示在当前会话中有效。可以在控制器方法的参数中使用HttpSession对象来向session域设置数据。
编写控制器方法 RequestMapping(/c2/hello6)public String setSessionModel(HttpSession session){session.setAttribute(address,狗熊岭);return ModelAndView;}编写jsp页面
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleModelAndView/title
/head
bodyh1您好${requestScope.name}/h1h1地址是${sessionScope.address}/h1
/body
/html
SpringMVC处理响应_向context域设置数据
context作用域表示在整个应用范围都有效。在SpringMVC中对context作用域传值可以使用ServletContext对象来实现。但是该对象不能直接注入到方法参数中需要通过HttpSession对象获取。
编写控制器方法
RequestMapping(/c2/hello7)public String setContextModel(HttpSession httpSession){ServletContext servletContexthttpSession.getServletContext();servletContext.setAttribute(age,10);return ModelAndView;}编写jsp页面
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleModelAndView/title
/head
bodyh1您好${requestScope.name}/h1h1地址是${sessionScope.address}/h1
h1年纪是${applicationScope.age}/h1
/body
/html
SpringMVC处理响应_请求转发重定向
之前的案例发现request域中的值可以传到jsp页面中也就是通过视图解析器跳转到视图的底层请求转发。
如果我们跳转时不想使用视图解析器可以使用原生HttpServletRequest进行请求转发或HttpServletResponse进行重定向 RequestMapping(/c2/hello8)public void myForward1(HttpServletRequest request,HttpServletResponse response)throwsException{request.setAttribute(name,光头强);//请求转发// request.getRequestDispatcher(/c2/hello9).forward(request,response);//原生重定向response.sendRedirect(/c2/hello9);}RequestMapping(/c2/hello9)public void myForward2(HttpServletRequest request){System.out.println(hello);System.out.println(request.getAttribute(name));}//SpringMVC提供了一种更简单的请求转发和重定向的方法RequestMapping(/c2/hello10)public String myForward(HttpServletRequest request){request.setAttribute(name,赵琳);//请求转发return forward:/c2/hello9;//重定向//return redirect:/c2/hello9;}SpringMVC注解_Controller、RequestMapping
Controller
作用标记控制器将控制器交给Spring容器管理。 位置类上方
RequestMapping
作用给控制器方法设置请求路径 位置方法或类上方。用于类上表示类中的所有控制器方法都是以该地址作为父路径。 属性
value/path:请求路径method:指定请求方式params:规定必须发送的请求参数headers:规定请求必须包含的请求头
Controller
RequestMapping(/c3)
public class MyController3 {/*** 访问路径/c2/hello2* 支持post和get请求* 请求必须带有username参数* 请求必须带有User-agent请求头* param username* return*/RequestMapping(path /hello1,method {RequestMethod.POST,RequestMethod.GET},params {username},headers {User-agent})public String annotation1(String username){System.out.println(username);return index;}
}SpringMVC注解_RequestParam
作用 在控制器方法中封装请求参数 位置方法参数前 属性
value/name指定请求参数名称defaultValue 为参数设置默认值required设置是否是必须要传入的参数 //定义请求的参数名为name默认值是BearComeOn,不是必须的参数RequestMapping(/a2)public String annotation2(RequestParam(name name,defaultValue BearComeOn, required false) String name){System.out.println(name);return index;}
请求URL的写法http://localhost:8080/c3/a2?namexy
SpringMVC注解_RequestHeader、CookieValue
RequestHeader
作用将请求头数据封装到控制器方法参数中 位置方法参数前
CookieValue
作用将Cookie数据封装到控制器方法参数中 位置方法参数前
//获取User-Agent请求头
// 获取JSESSIONID的Cookie值RequestMapping(/annotation3)public String annotation3(RequestHeader(User-Agent) String userAgent,CookieValue(JSESSIONID) String jSessionId){System.out.println(userAgent);System.out.println(jSessionId);return index;}SpringMVC注解_SessionAttributes
作用将Model模型中的数据存到session域中 位置类上方
Controller
RequestMapping(/c4)
//将模型中的name数据保存到session中
SessionAttributes(name)
public class MyController1 {RequestMapping(/t1)public String t1(Model model){//model中保存name数据model.addAttribute(name,熊出没);return ModelAndView;}RequestMapping(/t2)public String t2(HttpSession session){//从session中获取name数据Object namesession.getAttribute(name);System.out.println(name);return ModelAndView;}}
SpringMVC注解_ModelAttribute
作用1设置指定方法在控制器其他方法前执行
位置方法上方
Controller
RequestMapping(/c5)
public class MyController2 {ModelAttributepublic void before(){System.out.println(前置方法);}RequestMapping(/t1)public String t1(){System.out.println(t1);return ModelAndView;}
}作用2从Model模型中获取数据给参数赋值
位置方法上方
Controller
RequestMapping(/c6)
public class MyController4 {//前置方法向Model中设置数据ModelAttributepublic void before(Model model){model.addAttribute(name,喜羊羊);}//该参数不是从请求中获取而是从Model中获取RequestMapping(/t1)public String t1(ModelAttribute(name) String name){System.out.println(name);return ModelAndView;}
}
SpringMVC注解_RESTful风格支持
RESTful风格是一种URL路径的设计风格。在RESTful风格的URL路径中网络上的任意数据都可以看成一个资源它可以是一段文本、一张图片也可以是一个Java对象。而每个资源都会占据一个网络路径无论对该资源进行增删改查访问的路径是一致的。 传统URL: 查找id为1的学生 http://localhost:8080/student/findById?id30删除id为1的学生 http://localhost:8080/student/deleteById?id30 RESTful风格URL 查找id为30的学生 http://localhost:8080/student/30删除id为30的学生 http://localhost:8080/student/30 如何区分对该资源是哪一种操作通过请求方式不同判断进行的是什么操作。
之前我们学过两种请求方式GET请求和POST请求而访问RESTful风格的URL一共有四种请求方式
GET请求查询操作POST请求新增操作DELETE请求删除操作PUT请求修改操作 RESTful风格URL 查找id为30的学生 http://localhost:8080/student/30 GET方式请求删除id为30的学生 http://localhost:8080/student/30 DELETE方式请求 RESTful风格的优点:结构清晰、符合标准、易于理解、扩展方便。
SpringMVC注解_Postman使用
默认情况下浏览器是无法发送DELETE请求和PUT请求的我们可以使用Postman工具发送这些请求。 双击安装包安装Postman 点击new-collection创建请求集合 添加请求 保存请求到集合以后可以随时发送该请求
SpringMVC注解_PathVariable
作用在RESTful风格的URL中获取占位符的值 位置方法参数前 属性 value获取哪个占位符的值作为参数值如果占位符和参数名相同可以省略该属性。
Controller
RequestMapping(/student)
//模拟学生的增删改查控制器
public class MyController5 {//路径中的/{id}表示占位符,最后会封装到方法的参数中使用//删除学生RequestMapping(value /{id},method RequestMethod.DELETE)public String deleteStudent(PathVariable(id) int id){System.out.println(删除id为id的学生);return ModelAndView;}//如果占位符和参数名相同可以省略PathVariable中的value属性//根据id查询学生RequestMapping(value/{id},method RequestMethod.GET)public String findStudentById(PathVariable int id){System.out.println(查找id为id的学生);return ModelAndView;}//新增学生RequestMapping(value /{id},method RequestMethod.POST)public String addStudent(PathVariable int id, Student student){System.out.println(新增id为id的学生);System.out.println(student);return ModelAndView;}//修改学生RequestMapping(value /{id},method RequestMethod.PUT)public String updateStudent(PathVariable int id,Student student){System.out.println(修改id为id的学生);System.out.println(student);return ModelAndView;}}访问方式
新增学生POST localhost:8080/student/100?namedogsexfemale修改学生PUT localhost:8080/student/100?namedog1sex女1删除学生DELETE localhost:8080/student/100查询学生GET localhost:8080/student/100
SpringMVC注解_PostMapping、GetMapping、PutMapping、DeleteMapping
作用简化设置请求方式的RequestMapping写法 位置方法上方
Controller
RequestMapping(/student1)
public class StudentController {//删除学生DeleteMapping(/{id})public String deleteStudent(PathVariable(id) int id){System.out.println(删除id为id的学生);return ModelAndView;}//根据id查询学生GetMapping(/{id})public String findStudentById(PathVariable int id){System.out.println(id);System.out.println(根据id查询学生);return ModelAndView;}//新增学生PostMapping(/{id})public String addStudent(PathVariable int id, Student student){System.out.println(id);System.out.println(student);System.out.println(新增学生);return ModelAndView;}//修改学生PutMapping(/{id})public String updateStudent(PathVariable int id,Student student){System.out.println(id);System.out.println(student);System.out.println(修改学生);return ModelAndView;}
}SpringMVC注解_HiddenHttpMethodFilter
由于浏览器的表单只支持 GET与 POST请求不支持 DELETE、 PUT请求。所以SpringMVC提供了一个过滤器可以将浏览器的 POST请求改为指定的请求方式发送给控制器的方法。 用法如下
在web.xml中配置过滤器
!-- 请求方式过滤器--filterfilter-namehttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filterfilter-mappingfilter-namehttpMethodFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping编写控制器方法
Controller
RequestMapping(/c7)
public class MyController6 {DeleteMapping(/delete)public String testDelete(){System.out.println(删除方法);return Delete;}PutMapping(/put)public String testPut(){System.out.println(修改方法);return Delete;}
}在jsp中编写表单
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleDELETE、PUT提交/title
/head
body
%--删除--%
%--提交DELETE、PUT请求表单提交方式为post--%
%--表单中有一个隐藏域name值为_method,value值为提交方式--%
form action/c7/deleteinput typehidden name_method valueDELETEinput typesubmit value删除
/form
hr/
%--修改--%
form action/c7/put methodpostinput typehidden name_method valuePUTinput typesubmit value修改
/form
/body
/htmlSpringMVC注解_ResponseBody
作用方法返回的对象转换为JSON格式并将JSON数据直接写入到输出流中使用此注解后不会再经过视图解析器。使用该注解可以处理Ajax请求。 位置方法上方或方法返回值前
编写jsp页面发送ajax请求
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleajax请求/titlescript src/js/jquery-2.1.1.min.js/scriptscript$(function (){$(#btn).click(function () {var name$(#name).val();var gender$(#gender).val();$.get(/c8/addStudent,{name:name,gender:gender},function (data) {console.log(data);});});});/script
/head
body
姓名input idname/br/
性别input idgender/br/
input typebutton value提交 idbtn/
/body
/html
由于jsp页面中引入jQuery的js文件而SpringMVC会拦截所有资源造成jquery.js失效需要在SpringMVC核心配置文件中放行静态资源。 mvc:default-servlet-handler /编写结果实体类该实体类会封装一个请求的结果
//请求结果对象
public class Result {private boolean flag;//请求是否成功private String message;//请求提示信息//省略getter/setter/构造方法}编写控制器
Controller
RequestMapping(/c8)
public class MyController8 {GetMapping(/addStudent)ResponseBodypublic Result addStudent(String name,String gender) {System.out.println(name : gender);Result result new Result(true, 添加学生成功);return result;}
}SpringMVC会将Result对象转为JSON格式写入输出流而SpringMVC默认使用的JSON转换器是jackson需要在pom中添加jackson依赖。
!-- jackson --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-core/artifactIdversion2.9.0/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.9.0/version/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-annotations/artifactIdversion2.9.0/version/dependency
SpringMVC注解_RestController
如果一个控制器类下的所有控制器方法都返回JSON格式数据且不进行跳转可以使用RestController代替Controller此时每个方法上的ResponseBody都可以省略。
RestController
RequestMapping(/c8)
public class MyController8 {GetMapping(/addStudent)public Result addStudent(String name,String gender) {//输出接收到的参数模拟添加学生System.out.println(name : gender);//返回结果Result result new Result(true, 添加学生成功);return result;}
}
SpringMVC注解_静态资源映射
当在DispatcherServlet的 url-pattern中配置拦截 “/” 时除了jsp文件不会拦截以外其他所有的请求都会经过前端控制器进行匹配。此时静态资源例如css、js、jpg等就会被前端控制器拦截导致不能访问出现404问题。想要正常映射静态资源共有三种方案 配置静态资源筛查器
在SpringMVC的配置文件中配置 mvc:default-servlet-handler /后会在Spring容器中创建一个资源检查器它对进入DispatcherServlet的URL进行筛查如果不是静态资源才由DispatcherServlet处理。
修改SpringMVC核心配置文件 mvc:default-servlet-handler /配置静态资源映射器
SpringMVC模块提供了静态资源映射器组件通过 mvc:resources标签配置静态资源映射器配置后的路径不会由DispatcherServlet处理。 修改SpringMVC核心配置文件
!-- 配置静态资源映射器--
!-- mapping:配置请求的URL Location资源路径--mvc:resources mapping/img/ location/img//mvc:resources mapping/js/ location/js//配置默认Servlet处理静态资源
在web.xml可以配置默认Servlet处理静态资源该Servlet由tomcat提供它会直接访问静态资源不进行其他操作。这样就避免了使用DispatcherServlet对静态资源的拦截 修改web.xml: servlet-mappingservlet-namedefault/servlet-nameurl-pattern*.jpg/url-pattern/servlet-mappingservlet-mappingservlet-namedefault/servlet-nameurl-pattern*.css/url-pattern/servlet-mappingservlet-mappingservlet-namedefault/servlet-nameurl-pattern*.js/url-pattern/servlet-mappingservlet-mappingservlet-namedefault/servlet-nameurl-pattern*.png/url-pattern/servlet-mapping接口名字不可以重复
SpringMVC注解_RequestBody
作用将请求中JSON格式的参数转为JAVA对象位置写在方法参数前
AJAX请求发送JSON格式的参数
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleajax请求/titlescript src/js/jquery-2.1.1.min.js/scriptscript$(function () {$(#btn).click(function () {var name$(#name).val();var gender$(#gender).val();var paramJSON.stringify({name:name,gender:gender});$.ajax({url:/c8/addStudent2,contentType:application/json,type:post,data:param,success:function (data) {console.log(data);}})})})/script
/head
body
姓名input idnamebr/
性别input idgender br/
input typebutton value提交 idbtn
/body
/html编写控制器 PostMapping(/addStudent2)ResponseBodypublic Result addStudent2(RequestBody Student student){System.out.println(student);//返回添加结果Result resultnew Result(true,添加学生成功);return result;}SpringMVC文件上传_原生方式上传
上传是Web工程中很常见的功能SpringMVC框架简化了文件上传的代码我们首先使用JAVAEE原生方式上传文件
编写上传表单
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
h3文件上传/h3
%--上传表单的提交方式必须是post--%
%--enctype属性是multipart/fprm-data意思是不对表单数据进行编码--%
form action/c8/fileUpload methodpost enctypemultipart/form-data
%-- 文件上传控件类型是file必须要有name属性--%选择文件input typefile nameupload/input typesubmit value上传/
/form
/body
/html接收请求体数据
RequestMapping(/fileUpload)public String upload(HttpServletRequest request) throws Exception{//获取输入流ServletInputStream isrequest.getInputStream();//从输入流获取请求体数据int i0;while ((iis.read())!-1){System.out.println((char) i);}return upload;}接下来需要分析请求体中的文件项并将数据写入磁盘此时需要借助文件上传工具
引入文件上传依赖 !--文件上传--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-fileupload2-jakarta/artifactIdversion2.0.0-M1/version/dependency
编写控制器接收上传请求控制器进行三步操作创建文件夹存放上传文件。分析请求体找到上传文件数据。将文件数据写入文件夹。 RequestMapping(/c8/fileUpload1)public String upload1(HttpServletRequest request) throws Exception{//创建文件夹存放上传文件//1.设置上传文件路径String realPathD:\\springmvc\\mvc_demo1\\upload;//2.判断该目录是否存在如果不存在创建该目录File filenew File(realPath);if(!file.exists()){file.mkdirs();}//分析请求体找到上传文件数据//1.创建磁盘文件工厂DiskFileItemFactory factoryDiskFileItemFactory.builder().get();//2.创建上传数据分析器对象JakartaServletDiskFileUpload uploadnew JakartaServletDiskFileUpload(factory);//3.利用分析器对象解析请求体返回所有数据项ListDiskFileItem fileItemsupload.parseRequest(request);//4.遍历所有数据找到文件项(非表单项)for(FileItem fileItem:fileItems){if(!fileItem.isFormField()){//将文件数据写入文件夹//获取文件名String namefileItem.getName();//将文件写入磁盘fileItem.write(Paths.get(realPath,name));//删除内存中的临时文件fileItem.delete();}}return upload;}需要访问页面即upload.jsp。
SpringMVC文件上传_SpringMVC方式上传
SpringMVC使用框架提供的文件解析器对象可以直接将请求体中的文件数据转为MultipartFile对象从而省略原生上传中分析请求体的步骤。
在SpringMVC核心配置文件配置文件解析器
!-- 文件解析器对象--bean idmultipartResolver classorg.springframework.web.multipart.support.StandardServletMultipartResolver/bean在web.xml中进行上传配置
servletservlet-namedispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:springmvc.xml/param-value/init-paramload-on-startup1/load-on-startupmultipart-config
!-- 支持一次上传文件的总容量。单位字节100M100*1024*1024 --max-file-size104857600/max-file-size
!-- 支持一次请求上传文件的总容量--max-request-size418018841/max-request-size
!-- 文件最小容量--file-size-threshold0/file-size-threshold/multipart-config/servlet创建JSP表单
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
form action/c8/fileUpload2 methodpost enctypemultipart/form-datainput typefile namefile/input typesubmit value上传/
/form
/body
/html编写控制器接收上传请求
//MultipartFile参数名必须和JSP文件空间的name属性一致RequestMapping(/fileUpload2)public String upload2(MultipartFile file,HttpServletRequest request) throws IOException{//创建文件夹存放上传文件String realPathE:\\springmvc\\mvc_demo1\\upload;File dirnew File(realPath);if(!dir.exists()){dir.mkdirs();}//将上传的数据写到文件夹的文件中//1.拿到上传的文件名String filenamefile.getOriginalFilename();filename UUID.randomUUID()_filename;//2.创建空文件File newFilenew File(dir,filename);//3.将数据写入空文件中file.transferTo(newFile);return upload1;}SpringMVC文件上传_上传多文件
SpringMVC支持一次性上传多个文件写法如下
创建JSP表单
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
form action/c8/fileUpload3 methodpost enctypemultipart/form-data用户名input nameusername/文件1input typefile namefiles/文件2input typefile namefiles/input typesubmit value上传/
/form
/body
/html编写控制器接收上传请求 //处理多文件上传参数类型为MultipartFile数组参数名和JSP文件控件的name属性一致RequestMapping(/fileUpload3)public String upload3(MultipartFile files[],String username,HttpServletRequest request)throws Exception{System.out.println(username);//设置上传文件保存的文件夹String realPathE:\\Springmvc\\mvc\\upload;File dirnew File(realPath);if(!dir.exists()){dir.mkdirs();}//遍历数组将上传文件保存到文件夹for(MultipartFile file:files){String filenamefile.getOriginalFilename();filenameUUID.randomUUID()_filename;File newFilenew File(dir,filename);file.transferTo(newFile);}return multifile;}SpringMVC文件上传_异步上传
之前的上传方案在上传成功后都会跳转页面。而在实际开发中很多情况下上传后不进行跳转而是进行页面的局部刷新比如上传头像成功后将头像显示在网页中。这时候就需要使用异步文件上传。
编写JSP页面引入jQuery和jQuery表单上传工具jquery.form.js
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/titlescript src/js/jquery-2.1.1.min.js/scriptscript src/js/jquery.form.js/script
/head
body
h3文件上传/h3
form idajaxForm enctypemultipart/form-datainput typefile namefile/
%-- 按钮类型不能是submit,否则会刷新页面--%input typebutton value上传头像 idbtn/
/form
%--上传头像后展示的位置--%
img src/ width100 idimg
script$(function () {$(#btn).click(function () {$(#ajaxForm).ajaxSubmit({url:/fileUpload4,type:post,success:function (data) {$(#img).attr(src,data);}})})})
/script
/body
/html
编写控制器接收异步上传请求 RequestMapping(/fileUpload4)ResponseBodypublic String upload4(MultipartFile file,HttpServletRequest request) throws Exception{//创建文件夹存放上传文件String realPathrequest.getServletContext().getRealPath(/upload);File dirnew File(realPath);if(!dir.exists()){dir.mkdirs();}//将上传的数据写到文件夹的文件中String filenamefile.getOriginalFilename();filenameUUID.randomUUID()_filename;File newFilenew File(dir,filename);file.transferTo(newFile);//返回文件的路径return /upload/filename;}SpringMVC文件上传_跨服务器上传 由于文件占据磁盘空间较大在实际开发中往往会将文件上传到其他服务器中此时需要使用跨服务器上传文件。
解压tomcat作为图片服务器在tomcat的webapps下创建upload目录作为文件上传目录。修改tomcat的 conf/web.xml文件支持跨服上传。
servlet init-param param-namereadonly/param-name param-valuefalse/param-value /init-param
/servlet
修改tomcat的 conf/server.xml文件修改tomcat端口修改完开启tomcat服务器
Connector port8081 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /
编写JSP上传表单
% page contentTypetext/html;charsetUTF-8 languagejava %
htmlheadtitle上传/titlescript src/js/jquery-2.1.1.min.js/scriptscript src/js/jquery.form.js/script/headbodyh3文件上传/h3form idajaxForm enctypemultipart/form-data input typefile namefile/input typebutton value上传头像 idbtn//formimg src/ width100 idimgscript$(function () {$(#btn).click(function () {$(#ajaxForm).ajaxSubmit({url:/fileUpload5,type:post,success:function (data) {$(#img).attr(src,data);}})})})/script/body
/html
添加跨服上传依赖
!-- 跨服上传 --
dependencygroupIdcom.sun.jersey/groupIdartifactIdjersey-core/artifactIdversion1.18.1/version
/dependency
dependencygroupIdcom.sun.jersey/groupIdartifactIdjersey-client/artifactIdversion1.18.1/version
/dependency
创建控制器方法该方法在接受到上传请求后将文件保存到其他服务器上。
RequestMapping(/fileUpload5)
ResponseBody
public String upload4(MultipartFile file) throws Exception {// 设置跨服上传的服务器路径String path http://localhost:8081/upload/;// 获取上传的文件名String filename file.getOriginalFilename();filename UUID.randomUUID()_filename;// 跨服上传// 1.创建客户端对象Client client Client.create();// 2.使用客户端对象连接图片服务器WebResource resource client.resource(path filename);//3.传输数据resource.put(file.getBytes());return pathfilename;
}