当前位置: 首页 > news >正文

SpringBoot的Web开发

一、静态资源映射规则

第一种静态资源映射规则

总结: 只要静态资源放在类路径下: called /static (or /public or /resources or /META-INF/resources。

访问 : 当前项目根路径/ + 静态资源名帮助文档

静态资源访问前缀

spring:

        mvc:

                static-path-pattern: /apesource/**

二、enjoy模板引擎

1.将页面保存在templates目录下

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>success page
</body>
</html>

2.添加坐标

<dependency><groupId>com.jfinal</groupId><artifactId>enjoy</artifactId><version>5.0.3</version>
</dependency>

3.开启配置

package com.apesource.springboot_web_01.config;import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@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";//返回方法执行完要跳转的页 面名称}//http://localhost:8080/user/show2?msg1=aa&msg2=bb@RequestMapping(value="/show2",params = {"msg1=aa","msg2=bb"})public String show2(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("限制请求携带的参数");return "success";//返回方法执行完要跳转的页面名称}

三、springMVC

1.请求处理

@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==代表修饰类

//使用postman测试
@GetMapping("/show3")
public String show3(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("必须使用get方式请求");return "success";//返回方法执行完要跳转的页面名称
}@PostMapping("/show4")
public String show4(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("必须使用post方式请求");return "success";//返回方法执行完要跳转的页面名称
}@DeleteMapping("/show5")
public String show5(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("必须使用delete方式请求");return "success";//返回方法执行完要跳转的页面名称
}@PutMapping("/show6")
public String show6(){System.out.println("==========进入了springMVC的控制器=========");System.out.println("必须使用put方式请求");return "success";//返回方法执行完要跳转的页面名称
}}

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.数据类型合法

@Controller
@RequestMapping("/one")
public class OneController {@RequestMapping("/show")public String show(){return "one";}/********基本类型与字符串*********/@RequestMapping("/show1")public String show1(String msg1){System.out.println("====接受用户发送信息数据为:"+msg1+"====");return "success";}@RequestMapping("/show2")public String show2(String msg1,int msg2){System.out.println("====接受用户发送信息数据为:"+msg1+"====");System.out.println("====接受用户发送信息数据为:"+msg2+"====");return "success";}/******pojo类型作为参数*******///单一对象@RequestMapping("/show3")public String show3(Emp emp){System.out.println("====接受用户发送信息数据为:"+emp+"====");return "success";}//对象嵌套@RequestMapping("/show4")public String show4(Emp emp){System.out.println("====接受用户发送信息数据为:"+emp+"====");return "success";}//RequestParam@RequestMapping("/map")public String map(@RequestParam Map map){System.out.println(map);return "success";}/********POJO类中包含集合类型参数**************/@RequestMapping("/show5")public String show5(Dep dep){System.out.println("=====接受到用户发送数据为:"+dep+"=======");return "success";}@RequestMapping("/show6")public String show8(int[] nums){System.out.println("=====接受到用户发送数据为:"+ Arrays.toString(nums) +"=======");return "success";}/*********************使用 ServletAPI 对象作为方法参数*********************************/@RequestMapping("/show7")public String show7(HttpServletRequest request, HttpServletResponse response){//        request.setCharacterEncoding("UTF-8");//        response.setCharacterEncoding("UTF-8");System.out.println(request);System.out.println(response);request.getParameter("msg1");HttpSession session =     request.getSession();System.out.println(session);session.setAttribute("","");try {response.sendRedirect("/one/show6");} catch (IOException e) {e.printStackTrace();}ServletContext applaction =  session.getServletContext();return "success";}
}

3.常用注解

springMVC 常用注解

一.@RequestParam

作用:

        把请求中指定名称的参数给控制器中的形参赋值。

        如果页面标签名称和方法参数名称不一致,可以使用此注解实现

属性:

        name 属性:设置参数名称

        defaultValue 属性:设置默认值

        required 属性:设置是否为必传

二.@RequestBody

作用:

        用于获取 "请求体" 内容。直接使用得到是 key=value&key=value...结构的数据,并可以转换为对象。

属性:

        required:是否必须有请求体。默认值是:true。

三.@PathVaribale

作用:

        用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

属性:

        value:用于指定 url 中占位符名称。

        required:是否必须提供占位符。

        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

eg:

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

@Controller
@RequestMapping("/ones")
public class OnesController {@RequestMapping("/show1")public String show1(@RequestParam(name = "msg1") String msg) {System.out.println("====接受用户发送信息数据为:" + msg + "====");return "success";}@RequestMapping("/show2")public String show2(@RequestParam("msg1") String msg, @RequestParam("msg2") int num) {System.out.println("====接受用户发送信息数据为:" + msg + "====");System.out.println("====接受用户发送信息数据为:" + num + "====");return "success";}@RequestMapping("/show3")public String show3(@RequestParam(name = "uname", defaultValue = "暂无用户") String name) {System.out.println("账号:" + name);return "success";}//    @RequestBody可以将json ===> javvBean//    注意://        1.前端不能使用GET方式提交数据,GET方式无请求体//        {//            "eid":007,//            "ename":"张三",//            "esex":"男"//        }@RequestMapping("/show4")public String show4(@RequestBody Emps emps) {System.out.println("===="+ emps + "====");return "success";}@PostMapping("/show5/{uname}/{upwd}")public String show5(@PathVariable("uname")String msg1,@PathVariable("upwd")String msg2){System.out.println(msg1);System.out.println(msg2);return "success";}@PostMapping("/show6/{uname}/{upwd}")public String show6(@PathVariable String uname,@PathVariable String upwd){System.out.println(uname);System.out.println(upwd);return "success";}
}
<body><h1>springMVC控制器方法参数作用:接受用户请求中的数据</h1><hr/><h3>基本类型和String类型作为参数</h3><a href="/one/show1?msg1=9867">发送请求1</a><a href="/one/show2?msg1=jdk&msg2=9876">发送请求2</a><h3>POJO类型作为参数</h3><a href="/one/show3?eid=1&ename=rosie&esex=公主">发送请求3</a><form action="/one/show4" method="post">员工编号:<input type="text" name="eid"/><br/>员工姓名:<input type="text" name="ename"/><br/>员工性别:<input type="text" name="esex"/><br/>部门编号:<input type="text" name="dept.did"/><br/>部门名称:<input type="text" name="dept.dname"/><br/><input type="submit" value="发送请求4"/></form><form action="/one/map" method="post">员工编号:<input type="text" name="eids"/><br/>员工姓名:<input type="text" name="enames"/><br/>员工性别:<input type="text" name="esexs"/><br/><input type="submit" value="发送请求5(map)"/></form><h3>复杂数据类型集合作为参数</h3><form action="/one/show5" method="post">部门编号:<input type="text" name="did"/><br/>部门名称:<input type="text" name="dname"/><br/>员工编号1:<input type="text" name="mylist[0].eid"/><br/>员工姓名1:<input type="text" name="mylist[0].ename"/><br/>员工性别1:<input type="text" name="mylist[0].esex"/><br/>员工编号2:<input type="text" name="mylist[1].eid"/><br/>员工姓名2:<input type="text" name="mylist[1].ename"/><br/>员工性别2:<input type="text" name="mylist[1].esex"/><br/>员工编号3:<input type="text" name="mymap['one'].eid"/><br/>员工姓名3:<input type="text" name="mymap['one'].ename"/><br/>员工性别3:<input type="text" name="mymap['one'].esex"/><br/>员工编号4:<input type="text" name="mymap['two'].eid"/><br/>员工姓名4:<input type="text" name="mymap['two'].ename"/><br/>员工性别4:<input type="text" name="mymap['two'].esex"/><br/><input type="submit" value="发送请求6(list,map)"/></form><a href="/one/show6?nums=123&nums=456&nums=789">请求发送6(数组)</a><h3>使用ServletAPI对象作为方法参数</h3><a href="/one/show7">发送请求7(ServletAPI对象)</a>
</body>

四.@RequestHeader

作用:

        用于获取请求消息头。

属性:

        value:提供消息头名称

        required:是否必须有此消息头

五.@CookieValue

作用:

        用于把指定 cookie 名称的值传入控制器方法参数。

属性:

        value:指定 cookie 的名称。

        required:是否必须有此 cookie。

@Controller
@RequestMapping("/two")
public class twoController {//获取头信息//只获取头信息中的Accept-Language对应的数据(记得使用浏览器测试)@RequestMapping("/show1")public String show1(@RequestHeader(value = "msg1")String msg){System.out.println(msg);return "success";}//获取cookie@RequestMapping("/show2")public String show2(@CookieValue(value="JSESSIONID",required = false)String jsessionid){System.out.println(jsessionid);return "success";}
}

4.数据传递

//@ResponseBody 对象====>json

//位置:1.类

// 2.方法

//@RequestBody json====>对象

//位置:方法参数

//@RestController = @Controller + @ResponseBody

5.文件上传

@Controller
public class FileController03 {@RequestMapping("/show")public String show() {return "index1";}//文件上传@RequestMapping("fileupload")public String fileupload(String uname, MultipartFile upic, HttpServletRequest request) {System.out.println("用户名:" + uname);System.out.println(upic);System.out.println(upic.getOriginalFilename());System.out.println(upic.getName());//方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)//方式2.文件服务器(七牛云)//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.autoRegion());//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//...生成上传凭证,然后准备上传String accessKey = "nzcmmWRgqdZ3_rePvpVa5n4yQyBR-RqP-ccwFAVv";String secretKey = "B9p6Bq1_6leiPESxJElz2bOhIbxk7Coick3RabAu";String bucket = "20250916mpl";//默认不指定key的情况下,以文件内容的hash值作为文件名String key = null;try {byte[] uploadBytes = upic.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";}//文件删除@RequestMapping("filedelete")public String filedelete(HttpServletRequest request){String picname = (String) request.getSession().getAttribute("picname");System.out.println(picname);//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.autoRegion());//...其他参数参考类注释String accessKey = "nzcmmWRgqdZ3_rePvpVa5n4yQyBR-RqP-ccwFAVv";String secretKey = "B9p6Bq1_6leiPESxJElz2bOhIbxk7Coick3RabAu";String bucket = "20250916mpl";String key = picname;Auth auth = Auth.create(accessKey, secretKey);BucketManager bucketManager = new BucketManager(auth, cfg);try {bucketManager.delete(bucket, key);} catch (QiniuException ex) {//如果遇到异常,说明删除失败System.err.println(ex.code());System.err.println(ex.response.toString());}System.out.println("删除成功");return "success";}
}
<body><form action="fileupload" method="post" enctype="multipart/form-data">用户名:<input name="uname"/><br/>图片:<input type="file" name="upic"/><br/><input type="submit" value="上传"/></form><form action="filedelete" method="post" enctype="multipart/form-data"><input type="submit" value="删除"/></form>
</body>
<body><h3>成功页面</h3><span>#(session.picname)</span><img src="http://t2nx0z8n9.hn-bkt.clouddn.com/#(session.picname)"/>
</body>

四、注册Servlet三大组件 Servlet/Filter/Listener

        而由于 Spring Boot 默认是以 jar 包的方式运行嵌入式Servlet容器来启动应用,没有web.xml文件,Spring提供以下Bean来注册三大组件 。

        ServletRegistrationBean 注册自定义Servlet

        FilterRegistrationBean 注册自定义Filter

        ServletListenerRegistrationBean 注册自定义Listener

如果使用传统 @WebFilter...实现注册也可以

条件:1.一定是自定义组件

        2.启动类添加@ServletComponentScan

五、切换为其他嵌入式Servlet容器

SpringBoot 默认针对Servlet容器提供以下支持:

        Tomcat(默认使用)

        Jetty :支持长连接项目(如:聊天页面)

        Undertow : 不支持 JSP , 但是并发性能高,是高性能非阻塞的容器

六、restFul

http://www.dtcms.com/a/520039.html

相关文章:

  • 基于springboot的大创管理系统开发与设计
  • GitHub 热榜项目 - 日榜(2025-10-23)
  • RAG:让大模型“既懂又查”的智能系统
  • cms网站建设的优缺点wordpress两个站合并
  • 数据结构——B树及其基本操作
  • java.text.MessageFormat的用法
  • 公司网站怎么做分录平面设计怎么网上接单
  • Java爬虫性能优化:以喜马拉雅音频元数据抓取为例
  • 使用 Java 对 PDF 添加水印:提升文档安全与版权保护
  • CRMEB-PHP订单改价模块详解
  • 丽水 网站建设注册163免费邮箱
  • 网站建设微信开发怎么做订阅号
  • TypeScript Array(数组)
  • E160系列全国产超外差无线射频模块技术解析与应用指南
  • 20251023在Ubuntu20.04.6上编译AIO-3576Q38开发板的Android14
  • 故障后数据备份
  • C++(23):lambda可以模版参数
  • 全平台Ansible一键安装脚本:Ubuntu/Debian/RHEL全支持
  • leetcode 23 合并K个升序链表
  • Element Plus组件v-loading在el-dialog组件上使用无效
  • 广州骏域网站阿里云可以建设多个网站
  • 青海网站建设与制作网站做多长时间才会有流量
  • 金坛建设局网站网站建设的主要功能有哪些
  • UTB(Ultra-Thin Body)技术:原理、制造与未来展望
  • 【咨询】安卓开发语言选择分析(202510)
  • 兵团住房和城乡建设局网站做性的视频网站
  • 经典路径求解问题——路径之谜
  • AI大模型微调简介
  • Cesium绘制线:从基础到高级技巧
  • uniapp 实现网络测速小功能