SpringMVC静态资源与Servlet容器指南
一.静态资源映射规则
帮助文档
总结:
只要静态资源放在类路径下:called/static(or/public or/resource or META-INT/resources)
访问:当前项目的根路径/+静态资源名
二.enjoy模板引擎
1.将页面保存在templates目录下
2.添加坐标
<dependency><groupId>com.jfinal</groupId><artifactId>enjoy</artifactId><version>5.0.3</version> </dependency>
3.开启配置
@Configuration public class SpringBootConfig {@Bean(name = "jfinalViewResolver")public JFinalViewResolver getJFinalViewResolver() {// 创建用于整合 spring boot 的 ViewResolver 扩展对象JFinalViewResolver jfr = new JFinalViewResolver();// 对 spring boot 进行配置jfr.setSuffix(".html");jfr.setContentType("text/html;charset=UTF-8");jfr.setOrder(0);// 设置在模板中可通过 #(session.value) 访问 session 中的数据jfr.setSessionInView(true);// 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样Engine engine = JFinalViewResolver.engine;// 热加载配置能对后续配置产生影响,需要放在最前面engine.setDevMode(true);// 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件engine.setToClassPathSourceFactory();// 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath// 代替 jfr.setPrefix("/view/")engine.setBaseTemplatePath("/templates/");// 更多配置与前面章节完全一样// engine.addDirective(...)// engine.addSharedMethod(...);return jfr;} }
4.编写代码
@RequestMapping(path="/init")//二级目录 public String userInit(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("调用业务层,调用持久层");return "success";//返回方法执行完要跳转的页面名称 }@RequestMapping(value="/show1",method ={RequestMethod.POST}) public String show1(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("使用post方式发送请求进入");return "success";//返回方法执行完要跳转的页 面名称 }
三.springMVC
- 1.请求处理
- 2.参数绑定
- 3.常用注解
- 4.数据传递
- 5.文件上传
1.请求处理
@RequestMapping
/****@RequestMapping* 意义:处理用户的请求,相似于doget与dopost* 位置:* 类上:一级目录* 方法:二级目录* 例如:user/save* user/delete* student/save* student/delete* 属性:* value = "",path = ""* 表示请求路径* =========================* method=常量,此请求的类型(get,post),若不设置则此请求适配所有的请求方式* =========================* params = ""* 限制请求参数,例如:params={"msg1","msg2"}表示请求路径中必须携带参数名为msg1与msg2的参数** 注意:1.超链接默认发送的是get请求* 2.所有请求所携带的参数格式均为:key = value** @DeleteMapping删除* @PutMapping 修改* @GetMapping 查询* @PostMapping 新增** @RequestMapping可以点击查看源码* @Target({ElementType.METHOD, ElementType.TYPE})* METHOD==代表修饰方法,TYPE==代表修饰类
2.参数绑定
/*** springMVC请求参数的绑定* 绑定的机制:SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的** 一.支持数据类型:* 1.基本类型参数:* 包括基本类型和 String 类型* 2.POJO类型参数:* 包括实体类,以及关联的实体类* 3.数组和集合类型参数:* 包括 List 结构和 Map 结构的集合(包括数组)* 4.使用 ServletAPI 对象作为方法参数* HttpServletRequest* HttpServletResponse* HttpSession* java.security.Principal* Locale* InputStream* OutputStream* Reader* Writer** 二.使用要求* 1.发送请求中携带数据的key与方法参数的name必须一致* 2.数据类型合法** */
3.常用注解
@RequestParam
作用:
把请求中指定名称的参数给控制器中的形参赋值。
如果页面标签名称和方法参数名称不一致,可以使用此注解。
属性:
name属性:设置参数名称
defaultValue属性:设置默认值
required属性:设置是否为必传
@RequestBody
作用:
用于获取“请求体”内容,直接使用得到是key=value&key=value...结构的数据,并可以转换为对象。
属性:
required:是否必须有请求体,默认值是:true.
@PathVariable
作用:
用于绑定url中的占位符。例如:请求url中/delete/{id},这个{id}就是url占位符。url支持占位符是spring3.0后加入的,是springmvc支持rest风格URL的一个重要标志。
属性:
value:用于指定url中的占位符名称。
required:是否必须提供占位符。
@RequestHeader
作用:
用于获取请求消息头。
属性:
value:提供消息头名称。
required:是否必须有此消息头。
@CookieValue
作用:
用于把指定cookie名称的值传入控制器方法的参数。
属性:
value:指定cookie的名称。
required:是否必须有此cookie。
4.数据传递
@RequestMapping("/show4")public String show4(HttpSession session){System.out.println("==========show4=============");// 模拟数据库中查询数据Emp emp=new Emp(1,"张三","男");session.setAttribute("emp",emp);return "success_String";}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>返回值String成功页面</h1>
<span>#(session.emp.eid)</span>
<span>#(session.emp.ename)</span>
<span>#(session.emp.esex)</span>
</body>
</html>
5.文件上传
导入坐标
<!--导入七牛云需要坐标--><dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.25</version></dependency><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.2</version><scope>compile</scope></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version><scope>compile</scope></dependency><dependency><groupId>com.qiniu</groupId><artifactId>happy-dns-java</artifactId><version>0.1.6</version><scope>test</scope></dependency><!--文件上传--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency>
文件上传
@RequestMapping("/fileUpload")public String fileUpload(String uname, MultipartFile file, HttpServletRequest request, HttpSession session) {System.out.println("uname:" + uname);System.out.println("file:" + file);//方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)//方式2.文件服务器(七牛云)//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.autoRegion());//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//...生成上传凭证,然后准备上传String accessKey = "KdLYknp1GkTjvLa72NIhHZyO8qwUcDjOg9_hunNX";String secretKey = "CbYmLqqW52XtU3EnpYO8yHOk06kvSyvKIPoR6sBF";String bucket = "likejenne";//默认不指定key的情况下,以文件内容的hash值作为文件名String key = "mup";try {byte[] uploadBytes = file.getBytes();Auth auth = Auth.create(accessKey, secretKey);String upToken = auth.uploadToken(bucket);try {Response response = uploadManager.put(uploadBytes, key, upToken);//解析上传成功的结果DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);System.out.println(putRet.key);//获取文件名System.out.println(putRet.hash);//获取文件hash值request.getSession().setAttribute("picname", putRet.key);} catch (QiniuException ex) {Response r = ex.response;System.err.println(r.toString());try {System.err.println(r.bodyString());} catch (QiniuException ex2) {//ignore}}} catch (Exception ex) {//ignore}return "success";}
四.注册Servlet三大三大组件Servlet/Filter/Listener
servlet
package com.itheima.springboot_day03_demo02.controller;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/HttpServlet")
public class MyHttpServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("MyHttpServlet");}}
filter
package com.itheima.springboot_day03_demo02.controller;import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
import java.io.IOException;@WebFilter("/HttpServlet")
public class MyFilter extends HttpFilter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("MyFilter");chain.doFilter(request, response);}
}
Listener
package com.itheima.springboot_day03_demo02.controller;import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;public class MyListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println("监听器启动");}@Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println("监听器销毁");}}
五.切换为其他嵌入式Servlet容器
SpringBoot 默认针对Servlet容器提供以下支持:
Tomcat(默认使用)
Jetty :支持长连接项目(如:聊天页面)[ˈdʒeti]
Undertow : 不支持 JSP , 但是并发性能高,是高性能非阻塞的容器[ˈʌndətəʊ]
<!--切换Jetty--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> <!-- 排除tomcat容器--><exclusions><exclusion><artifactId>spring-boot-starter-tomcat</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><dependency><groupId>spring-boot-starter-jetty</groupId><artifactId>org.springframework.boot</artifactId></dependency><!-- 以上是更换内置服务器依赖-->
六.restFul
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。 主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次, * 更易于实现缓存机制等。
Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
* GET:用于获取资源 * POST:用于新建资源 * PUT:用于更新资源 * DELETE:用于删除资源 * 例如: * /users/1 GET : 得到 id = 1 的 user * /users/1 DELETE: 删除 id = 1 的 user * /users/1/新名/新性 PUT: 更新 id = 1 的 user * /users/新名/新性 POST: 新增 user * * http://localhost:8080/userSave?uid=101&uname=XX * * post http://localhost:8080/users/101/XX * get http://localhost:8080/users/101 * delete http://localhost:8080/users/101 * put http://localhost:8080/users/101/XX