springMVC
2023-04-11 08:55:17 7 举报AI智能生成
无
后端
模版推荐
作者其他创作
大纲/内容
配置流程
导入依赖<br>
<dependency><br> <groupId>org.springframework</groupId><br> <artifactId>spring-webmvc</artifactId><br> <version>5.1.6.RELEASE</version><br></dependency>
配置前端控制器<br>
<servlet><br> <servlet-name>mvc</servlet-name><br> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><br> <!-- 局部参数:声明配置文件位置 --><br> <init-param><br> <param-name>contextConfigLocation</param-name><br> <param-value>classpath:mvc.xml</param-value><br> </init-param><br> <!-- Servlet启动时刻:可选 --><br> <load-on-startup>1</load-on-startup><br></servlet><br><servlet-mapping><br> <servlet-name>mvc</servlet-name><br> <url-pattern>/</url-pattern><br></servlet-mapping>
配置handelerMapper<br>
<mvc:annotation-driven></mvc:annotation-driven>
配置试图解析器<br>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><br> <!-- 前缀 --><br> <property name="prefix" value="/"></property><br> <!-- 后缀 --><br> <property name="suffix" value=".jsp"></property><br></bean>
配置后端控制器
controller层
接受请求参数
基本类型参数
请求参数和方法的形参 同名
实体收参
请求参数和实体的属性 同名
数组收参
集合收参
路径参数
跳转
转发
return "forward:/views/users.jsp";
return "forward:/forw/test1"; //绝对路径
return "index" //相当于转发
重定向
return "redirect:/redir/test1";//绝对路径
return "redirect:/view/user.jsp";
后端响应值
request域
Map
map.put()
Model<br>
model.addAttribute()
ModelMap
modelMap.addAttribute()
ModelAndView<br>
@RequestMapping("/test")<br>public ModelAndView testData(){//返回值类型为ModelAndView<br> //新建ModelAndView对象<br> ModelAndView mv = new ModelAndView();<br> // 设置视图名,即如何跳转<br> mv.setViewName("forward:/index.jsp");<br> // 增加数据<br> mv.addObject("age",18);<br> return mv;<br>}<br>
session域
@SessionAttributes(value = {"id","username"}, types = {User.class})
解决静态资源问题<br>
此时,所有访问handler的路径都要以 action结尾!!<br><servlet><br> <servlet-name>mvc9</servlet-name><br> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><br></servlet><br><servlet-mapping><br> <servlet-name>mvc9</servlet-name><br> <url-pattern>*.action</url-pattern><br></servlet-mapping><br><br>
DispathcerServlet的url-pattern依然采用 "/",但追加配置<br><!-- <br> 额外的增加一个handler,且其requestMapping: "/**" 可以匹配所有请求,但是优先级最低<br> 所以如果其他所有的handler都匹配不上,请求会转向 "/**" ,恰好,这个handler就是处理静态资源的<br> 处理方式:将请求转会到tomcat中名为default的Servlet<br> --><br><mvc:default-servlet-handler/><br>
- mapping是访问路径,location是静态资源存放的路径<br>- 将/html/** 中 /**匹配到的内容,拼接到 /hhh/后<br> http://..../html/a.html 访问 /hhh/a.html<br><mvc:resources mapping="/html/**" location="/hhh/"/><br>
Json处理
使用流程
导入依赖
<!-- Jackson springMVC默认的Json解决方案选择是 Jackson,所以只需要导入jackson的jar,即可使用。--><br><dependency><br> <groupId>com.fasterxml.jackson.core</groupId><br> <artifactId>jackson-databind</artifactId><br> <version>2.9.8</version><br></dependency>
在方法上加注释:<br>@ResponseBody //将controller类的返回值,转换成json(jackson),并将json响应给客户端。<br>在类上边加注释,作用于类里所有方法:<br>@RestController<br>
注释作用
@JsonProperty()
属性名修改<br>
@JsonIgnore<br>
属性忽略<br>
@JsonInclude(JsonInclude.Include.NON_NULL)<br>
null属性排除
@JsonInclude(JsonInclude.Include.NON_EMPTY)<br>
empty属性排除<br>
@JsonSerialize(using = MySerializer.class)<br>
自定义序列化
public class MySerializer extends JsonSerializer<Double> {<br> @Override<br> public void serialize(Double aDouble, JsonGenerator jsonGenerator,<br> SerializerProvider serializerProvider) throws IOException {<br> String s = BigDecimal.valueOf(aDouble).setScale<br> (2, BigDecimal.ROUND_HALF_UP).toString();<br> jsonGenerator.writeNumber(s);<br> }<br>}
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
日期格式化
异常处理
web.xml配置版本
<error-page><br> <error-code>500</error-code><br> <location>/500.html</location><br></error-page><br>
本类可用的异常处理
//将此方法加在需要异常处理的类中<br>@ExceptionHandler<br> public String resolveException(RuntimeException e) {<br> System.out.println("ExceptionController01出现异常");<br> e.printStackTrace();<br> return "index";<br> }
全局异常处理
//增加一个自定义类<br>@ControllerAdvice<br>public class GlobalExceptionHandler {<br><br> @ExceptionHandler(Exception.class)<br> public ModelAndView exec(Exception e) {<br> ModelAndView mav = new ModelAndView();<br> mav.addObject("errorMsg", e);<br> mav.setViewName("error");<br> return mav;<br> }<br>}
拦截器
作用:(不确定)<br>拦截请求,但不能拦截前端页面
执行顺序: preHandle--postHandle--afterCompletion
使用流程
定义拦截器类(实现HandlerInterceptor接口)
public class LoginInterceptor implements HandlerInterceptor {<br> @Override<br> public boolean preHandle(HttpServletRequest request, HttpServletResponse response,<br> Object handler) throws Exception {<br><br> System.out.println("preHandle");<br> HttpSession session = request.getSession();<br> Object user = session.getAttribute("user");<br> if (user == null) {<br> System.out.println("没有登录...");<br> response.sendRedirect("/day20230331/login.html");<br> return false;<br> }else {<br> return true;<br> }<br><br> }<br><br> @Override<br> public void postHandle(HttpServletRequest request, HttpServletResponse response,<br> Object handler, ModelAndView modelAndView) throws Exception {<br><br> System.out.println("postHandle");<br> }<br><br> @Override<br> public void afterCompletion(HttpServletRequest request, HttpServletResponse response,<br> Object handler, Exception ex) throws Exception {<br><br> System.out.println("afterCompletion");<br> }<br>}<br>
配置applicationContext.xml
<mvc:interceptors><br> <mvc:interceptor><br> <mvc:mapping path="/**"/>//要拦截的请求<br> <mvc:exclude-mapping path="/login/log"/>//不拦截的请求<br> <bean class="com.wsk.interceptor.LoginInterceptor"/><br> </mvc:interceptor><br><br> </mvc:interceptors>
上传(本地上传到服务器)
使用流程
导入依赖
<dependency><br> <groupId>commons-io</groupId><br> <artifactId>commons-io</artifactId><br> <version>2.4</version><br></dependency><br><br><dependency><br> <groupId>commons-fileupload</groupId><br> <artifactId>commons-fileupload</artifactId><br> <version>1.3.3</version><br> <exclusions><br> <exclusion><br> <groupId>javax.servlet</groupId><br> <artifactId>servlet-api</artifactId><br> </exclusion><br> </exclusions><br></dependency>
配置applicationContext.xml(上传解析器)<br>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><br> <property name="maxUploadSize" value="10485760"/>//文件最大字节数<br> <property name="maxUploadSizePerFile" value="1048576"/>//单个文件最大字节数<br> <property name="defaultEncoding" value="UTF-8"/><br></bean>
前端代码
<form action="upLoad" method="post" enctype="multipart/form-data"><br> 文件:<input type="file" name="file"><br><br> <button type="submit">上传</button><br><br></form>
后端代码<br>
@RestController<br>public class UpLoadController {<br><br> @RequestMapping("/upLoad")<br> public String upLoad(MultipartFile file, HttpSession session) {<br> String filename = file.getOriginalFilename();//获取文件名<br> System.out.println("filename="+filename);<br> String prefix = filename.split("\\.")[0];<br> String suffix = filename.split("\\.")[1];<br> String random = UUID.randomUUID().toString();<br> filename = prefix + random + "." + suffix;<br> String path = session.getServletContext().getRealPath("/upload");//创建存放目录路径<br> System.out.println("path="+path);<br> File file1 = new File(path);<br> if (!file1.exists()) {<br> file1.mkdirs();<br> }<br><br> try {<br> file.transferTo(new File(path, filename));//上传文件<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br> System.out.println("上传完成...");<br> return "index";<br> }<br>}
下载(服务器下载到本地)
前端代码
<a href="downLoad?name=1.jpg">1.jpg 下载</a><br>//对应服务器里文件的名称
后端代码
@RestController<br>public class DownLoadController {<br><br> @RequestMapping("/downLoad")<br> public String downLoad(String name, HttpSession session, HttpServletResponse resp) {<br> String realPath = session.getServletContext().getRealPath("/upload");<br> File file = new File(realPath, name);//通过名称和存放文件夹获取文件<br> System.out.println(file.getAbsolutePath());<br><br> resp.setHeader("content-disposition","attachment;filename="+name);<br><br> try {<br> ServletOutputStream out = resp.getOutputStream();//获得输出流<br> FileInputStream in = new FileInputStream(file);<br> BufferedInputStream bis = new BufferedInputStream(in);<br><br> byte[] arr = new byte[1024*50];<br> int len;<br> while ((len = bis.read(arr)) != -1) {<br> out.write(arr, 0, len);<br> out.flush();<br> }<br> System.out.println("下载完成...");<br> } catch (IOException e) {<br> e.printStackTrace();<br> }<br><br> return "index";<br> <br> }<br>}
restful风格开发
概念
具体说,就是HTTP协议里面,四个表示操作方式的动词:<br>GET POST PUT DELETE<br>它们分别代表着四种基本操作:<br>GET用来获取资源<br>POST用来创建新资源<br>PUT用来更新资源<br>DELETE用来删除资源<br>示例:<br>/order/1 HTTP GET :得到id = 1 的 order<br>/order/1 HTTP DELETE: 删除 id=1 的order<br>/order/1 HTTP PUT : 更新id = 1的 order<br>/order HTTP POST : 新增 order
两个核心要求:<br>- 每个资源都有唯一的标识(URL)<br>- 不同的行为,使用对应的http-method
如何将post请求转换成其他类型请求
web.xml中配置过滤器
<filter><br> <filter-name>hiddenHttpMethodFilter</filter-name><br> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class><br></filter><br><filter-mapping><br> <filter-name>hiddenHttpMethodFilter</filter-name><br> <url-pattern>/*</url-pattern><br></filter-mapping>
前端代码:<br><input type="hidden" name="_method" value="put"></input type="hidden" name="_method" value="put"><input type="hidden" name="_method" value="put"></input type="hidden" name="_method" value="put"><input type="hidden" name="_method" value="put"></input type="hidden" name="_method" value="put"><input type="hidden" name="_method" value="PUT"><br>value里是要转换成的请求类型
<a href="player">查询全部</a><br><br><a href="player/1">查询单个</a><br><br><form action="player" method="post"><br> <input type="text" name="id" placeholder="id"><br><br> <input type="text" name="name" placeholder="name"><br><br> <input type="date" name="birth" placeholder="birth"><br><br> <button type="submit">新增</button><br><br></form><br><form action="player" method="post"><br> <input type="hidden" name="_method" value="PUT"><br><br> <input type="text" name="id" placeholder="id"><br><br> <input type="text" name="name" placeholder="name"><br><br> <input type="date" name="birth" placeholder="birth"><br><br> <button type="submit">更新</button><br><br></form><br><form action="player/3" method="post"><br> <input type="hidden" name="_method" value="DELETE"><br><br> <button type="submit">删除</button><br><br></form><br>
后端代码
@RestController<br>public class RestfulController {<br><br> @GetMapping("/player")<br> public List<Player> getAll() {<br> System.out.println("查询全部...");<br> return null;<br> }<br><br> @GetMapping("/player/{id}")<br> public Player getOne (@PathVariable("id") Integer id) {<br> System.out.println("查单个..."+id);<br> return null;<br> }<br><br> @PostMapping("/player")<br> public String add(Player player) {<br> System.out.println("新增...");<br> System.out.println(player);<br> return null;<br> }<br><br> @PutMapping("/player")<br> public String upDate(Player player) {<br> System.out.println("更新...");<br> System.out.println(player);<br> return null;<br> }<br><br> @DeleteMapping("/player/{id}")<br> public String delete(@PathVariable("id") Integer id) {<br> System.out.println("删除..."+id);<br> return null;<br> }<br>}
跨域问题
使用流程
在需要设置跨域请求的类上边加注释:<br>@CrossOrigin({"http://111.0.0.1:8848"})<br>
Collect
Get Started
Collect
Get Started
Collect
Get Started
Collect
Get Started
评论
0 条评论
下一页