高级网站设计效果图,app大概需要多少钱,全国中高风险地区最新名单,热狗网站关键词优化SpringBoot的Web开发
官网学习#xff1a;
进入spring官网 -- projects -- SpringBoot -- LEARN -- Reference Doc. -- Web -- 就能看到上述页面
静态资源映射规则
官方文档 总结#xff1a; 只要是静态资源#xff0c;放在类路径下#xff1…SpringBoot的Web开发
官网学习
进入spring官网 -- projects -- SpringBoot -- LEARN -- Reference Doc. -- Web -- 就能看到上述页面
静态资源映射规则
官方文档 总结 只要是静态资源放在类路径下called /static (or/public or /resources or /META-INF/resources) 访问当前项目根路径/静态资源名称 静态资源访问前缀修改 spring:mvc:static-path-pattern: /dong/**
#添加此配置所有静态资源的访问路径就需要添加一级路径/dong一般来说创建好SpringBoot项目之后resources路径下会有一个static目录cssjs图片视频音频都需要存放在此目录下
enjoy模板引擎
SpringBoot整合enjoy模板引擎步骤 将页面保存在templates目录下 添加enjoy的坐标 dependencygroupIdcom.jfinal/groupIdartifactIdenjoy/artifactIdversion5.0.3/version
/dependency开启配置配置类 在启动类同级新建config包包下新建EnjoyConfig类不需要自己写JFinal官网有 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;charsetUTF-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;}
}唯一需要改动的地方engine.setBaseTemplatePath(“/templates/”); 填写页面目录/templates/ 编写代码
Spring MVC请求处理
常用五种请求处理方式注解
RequestMapping
可以点击查看源码 意义处理用户的请求相似于doget与dopost 位置 类上:一级目录 方法:二级目录 例如:user/save user/delete student/save student/delete 属性 value ,path 表示请求路径 egRequestMapping(value“/show”)或RequestMapping(path“/show”) 也可以省略RequestMapping(“/show”) method常量此请求的类型(get,post),若不设置则此请求适配所有的请求方式 egRequestMapping(value“/show”,method{RequestMethod.POST}) 必须用post请求才能请求到此路径 params 限制请求参数,例如params{“msg1”,“msg2”}表示请求路径中必须携带参数名为msg1与msg2的参数 注意:1.超链接默认发送的是get请求 2.所有请求所携带的参数格式均为key value egRequestMapping(value“/show”,params {“msg1aa”,“msg2bb”}) 请求必须携带参数msg1和msg2且msg1的值必须是aamsg2的值必须是bb才能访问
DeleteMapping 删除
PutMapping 修改
GetMapping 查询
PostMapping 新增
Target({ElementType.METHOD, ElementType.TYPE}) METHOD代表修饰方法,TYPE代表修饰类Postman测试工具
在没有页面表单的情况下Postman可以模拟浏览器请求方式进行测试
Postman官网下载注册登录即可使用
Spring MVC参数绑定
Spring MVC请求参数绑定机制
SpringMVC 绑定请求参数的过程是通过把表单提交请求参数作为控制器中方法参数进行绑定的 支持的数据类型 基本类型参数基本数据类型和String类型 POJO类型参数实体类以及关联的实体类 数组和集合类型参数包括 List 结构和 Map 结构的集合包括数组 使用ServletAPI 对象作为方法参数 HttpServletRequest、HttpServletResponse、HttpSession、java.security.Principal、Locale、InputStream、OutputStream、Reader、Writer 使用要求 发送请求中携带数据的key与方法参数的name必须一致数据类型合法
总结
参数从页面传递过来时名字必须和接收的参数相同参数的数据类型必须合法不同类型的数据演示如下
演示步骤 创建SpringBoot项目并导入enjoy坐标 添加配置类 templates目录下的页面 one.html !DOCTYPE html
html langcn xmlns:thhttp://www.thymeleaf.org
headtitleTitle/title
/head
bodyh1springMVC控制器方法参数作用接受用户请求中的数据/h1hr/h3基本类型和 String 类型作为参数/h3a href/one/show1?msg19527发送请求1/aa href/one/show2?msg1jdkmsg29527发送请求2/ah3POJO 类型作为参数/h3a href/one/show3?eid1ename郭凡esex小奶狗发送请求3/aform action/one/show4 methodpost员工编号:input typetext nameeid br/员工姓名:input typetext nameename br/员工性别:input typetext nameesex br/部门编号:input typetext namedept.did br/部门名称:input typetext namedept.dname br/input typesubmit value发送请求4//formform action/one/map methodpost员工编号:input typetext nameeidsbr/员工姓名:input typetext nameenamesbr/员工性别:input typetext nameesexsbr/input typesubmit value发送请求4(map)//formh3POJO 类中包含集合类型参数/h3form action/one/show5 methodpost部门编号:input typetext namedid br/部门名称:input typetext namedname br/员工编号1:input typetext namemylist[0].eid br/员工姓名1:input typetext namemylist[0].ename br/员工性别1:input typetext namemylist[0].esex br/员工编号2:input typetext namemylist[1].eid br/员工姓名2:input typetext namemylist[1].ename br/员工性别2:input typetext namemylist[1].esex br/员工编号3:input typetext namemyMap[one].eid br/员工姓名3:input typetext namemyMap[one].ename br/员工性别3:input typetext namemyMap[one].esex br/员工编号4:input typetext namemyMap[two].eid br/员工姓名4:input typetext namemyMap[two].ename br/员工性别4:input typetext namemyMap[two].esex br/input typesubmit value发送请求5//forma href/one/show6?nums123nums456nums789发送请求6/ah3使用 ServletAPI 对象作为方法参数/h3a href/one/show7发送请求7/a/body
/htmlsuccess.html 访问成功页面 !DOCTYPE html
headmeta charsetUTF-8titleTitle/title
/head
bodyh1spring成功页面/h1
/body
/html创建POJO类 Emp public class Emp implements Serializable {private int eid;private String ename;private String esex;/*依赖对象Dep*/private Dep dept;//get、set、toString()方法
}Dep public class Dep {private int did;private String dname;//集合类型的参数private ListEmp mylist;private MapString,Emp myMap;//get、set、toString()方法
}控制器 Controller
RequestMapping(one)
public class UserController {RequestMapping(path /show)public String show(){return one;}// 一个参数页面传过来参也得是msg1且数据合法RequestMapping(path /show1)public String show1(int msg1){System.out.println(show1--msg1的参为msg1);return success;}// 两个参页面要传递msg1,msg2RequestMapping(path /show2)public String show2(String msg1,int msg2){System.out.println(show2--msg1msg1msg2msg2);return success;}// 页面传递时参数必须按照Emp实体类中属性的顺序进行传递RequestMapping(path /show3)public String show3(Emp emp){System.out.println(show3--对象参数empemp.toString());return success;}// 对象中嵌套了一个对象被嵌套的对象也需要按实体类中顺序传递PostMapping(path /show4)public String show4(Emp emp){System.out.println(show4--对象参数嵌套empemp.toString());return success;}// map接收数据必须要加RequestParam注解PostMapping(path /map)public String map(RequestParam Map map){System.out.println(map);return success;}// Dep实体类中有List和Map类型的数据类型用Dep类型接收RequestMapping(/show5)public String show5(Dep dept){System.out.println(show5--deptdept);return success;}// 接收数组类型页面传参nums1nums2$nums3,多用于复选框RequestMapping(/show6)public String show6(int[] nums){System.out.println(show6--int[] 数组 Arrays.toString(nums));return success;}// 请求和响应的接收RequestMapping(/show7)public String show7(HttpServletRequest request, HttpServletResponse response){System.out.println(request);System.out.println(response);request.getParameter(msg1);HttpSession session request.getSession();System.out.println(session);session.setAttribute(,);try {response.sendRedirect(重定向);} catch (IOException e) {e.printStackTrace();}ServletContext servletContext session.getServletContext();return success;}}启动项目浏览器访问localhost:8080/one/show点击按钮超链接控制台即可打印传参
Spring MVC常用注释
RequestParam 作用 把请求中指定名称的参数给控制器中的形参赋值。 如果页面标签名称和方法参数名称不一致可以使用此注解实现 属性 name属性设置参数名称 defaultValue属性设置默认值 required属性设置是否为必传 RequestParam(“名称必须与页面标签或者url地址key名称一致”)
RequestMapping(/show1)
public String show1(RequestParam(namemsg1) String msg){System.out.println(接受到用户发送数据为:msg);return success;
}获取请求中的参数msg1赋值给msg
RequestMapping(/show2)
public String show2(RequestParam(msg1) String msg, RequestParam(msg2) int num){System.out.println(接受到用户发送数据为:msg);System.out.println(接受到用户发送数据为:num);return success;
}获取请求中的参数msg1赋值给msg参数msg2赋值给num
RequestMapping(/show3)
public String show4(RequestParam(name uname,defaultValue 暂无用户) String name){System.out.println(账号:name);return success;
}获取请求中的参数uname赋值给name若uname为nullname则为暂无用户
RequestMapping(/show3)
public String show4(RequestParam(name uname,required false) String name){System.out.println(账号:name);return success;
}获取请求中的参数uname赋值给namerequiredfalesuname是非必传参数
RequestBody 作用 用于获取请求体内容。直接使用得到是 keyvaluekeyvalue… 结构的数据,并可以转换为对象 属性 required是否必须有请求体。默认值是:true。 RequestBody一般用于前后端分离RequestBody可以将json ---- javaBean 注意前端不能使用GET方式提交数据,GET方式无请求体
/*从请求获取到JSON格式*/
RequestMapping(/show4)public String show4(RequestBody Emp emp){System.out.println(emp);return success;
}Postman模拟请求 控制器获取请求中的Json格式将Json转换为Emp实体类
PathVaribale 作用 用于绑定 url 中的占位符。例如请求 url 中 /delete/{id}这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志 属性 value用于指定url中占位符的名称 required是否必须提供占位符。 Restful 是一种软件架构风格、设计风格而不是标准只是提供了一组设计原则和约束条件 主要用于客户端和服务器交互类的软件基于这个风格设计的软件可以更简洁更有层次更易于实现缓存机制等。 eglocalhost:8080/one/show/{uname}/{pwd} 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
PostMapping(/show5/{uname}/{pwd})
public String show5(PathVariable(uname) String msg1, PathVariable(pwd) String msg2){System.out.println(msg1);System.out.println(msg2);return success;
}urllocalhost/one/show5/tom/123456请求url中携带数据占位符{uname}位置的值为tom占位符{pwd}位置的值为123456将uname值赋给msg1pwd值赋给msg2
PostMapping(/show6/{uname}/{pwd})
public String show6(PathVariable String uname, PathVariable String pwd){System.out.println(uname);System.out.println(pwd);return success;
}urllocalhost/one/show5/tom/123456当方法中的参数和占位符的名称相同时只需要写注解PathVariable不需要再写value
RequestHeader 作用 用于获取请求消息头。 属性 value提供消息头名称 required是否必须有此消息头 只获取头信息中的Accept-Language对应的数据
RequestMapping(/show1)
public String show1(RequestHeader(value msg1)String msg){System.out.println(msg);return test;
}获取Headers中的信息msg1赋值给msg
CookieValue 作用 用于把指定 cookie 名称的值传入控制器方法参数 属性 value指定 cookie 的名称 required是否必须有此 cookie
RequestMapping(/show2)
public String show2(CookieValue(value JSESSIONID,required false)String jsessionid){System.out.println(jsessionid);return test;
}浏览器中请求urllocalhost:8080/show2获取Cookie中的JSESSIONID赋值给jseesionid
第一次访问时jsessionid为null
第二次访问起jsessionid有值
Spring MVC数据传递
String
返回值为页面名称
RequestMapping(/show1)
public String show1(){System.out.println(show1);return success_String;
}充当视图的逻辑名称默认页面跳转为请求转发方式
redirect:show1
RequestMapping(/show2)
public String show2(){System.out.println(show2);return redirect:show1;
}redirect重定向到show1
forward:show1
RequestMapping(/show3)
public String show3(){System.out.println(show3);return forward:show1;
}forward转发到show1
session存储参数
RequestMapping(/show4)
public String show4(HttpServletRequest request){System.out.println(show4);//1.查询数据库(模拟)Emp emp new Emp(1,张毅老师,男);//2.获取sessionrequest.getSession().setAttribute(emp,emp);return success_String;
}Json
返回值为Json字符串主要用于前后端分离
ResponseBody 作用 对象json 位置 类方法
RequestMapping(/show1)
ResponseBody
public ListEmp show1(){//1模拟数据库Emp emp1 new Emp(1,张三,男);Emp emp2 new Emp(2,李四,男);Emp emp3 new Emp(3,王五,男);ListEmp list new ArrayList();list.add(emp1);list.add(emp2);list.add(emp3);return list;
}页面显示一个json格式的字符串
RequestBody 作用 json对象 位置 方法参数
RequestMapping(/show2)
ResponseBody
public String show2(){return helloWorld;
}页面显示字符串“helloworld”
RestControllerController ResponseBody
若添加了RestController注解的类类不需要写Controller、返回Json的方法也不需要写ResponseBody
Spring MVC上传文件
上传文件可以存储在本地物理磁盘但存储磁盘占用内存成本高开销大不建议
还可以上传到云服务器进行存储采用技术为七牛云
七牛云
七牛云官网 注册账号完成实名制 点击左侧三个横杠对象存储Kodo创建一个仓库 填写信息 存储空间名称按要求起名字
存储区域选择地理位置近的
访问控制选择公开
上传文件至七牛云 创建SpringBoot Web项目 pom文件导坐标 除web启动器和test启动器外还需要导入enjoy、七牛云、上传文件的坐标 !--enjoy--
dependencygroupIdcom.jfinal/groupIdartifactIdenjoy/artifactIdversion5.0.3/version
/dependency!--七牛云所需坐标--
dependencygroupIdcom.qiniu/groupIdartifactIdqiniu-java-sdk/artifactIdversion7.2.25/version
/dependency
dependencygroupIdcom.squareup.okhttp3/groupIdartifactIdokhttp/artifactIdversion3.14.2/versionscopecompile/scope
/dependency
dependencygroupIdcom.google.code.gson/groupIdartifactIdgson/artifactIdversion2.8.5/versionscopecompile/scope
/dependency
dependencygroupIdcom.qiniu/groupIdartifactIdhappy-dns-java/artifactIdversion0.1.6/versionscopetest/scope
/dependency!--文件上传--
dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version
/dependencydependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion1.3.3/version
/dependency添加enjoy模板配置类此处省略 页面存放在resources下的templates目录 index.html !DOCTYPE html
html langen
headmeta charsetUTF-8title文件上传/title
/head
body文件上传olli坐标/lili制作页面-form表单编码/lili通过*****接受文件/li/olhr/form actionfileupload methodpost enctypemultipart/form-data用户名:input nameuname/br/图片:input nameupic typefile/br/input typesubmit value上传//form
/body
/htmlsuccess.html !DOCTYPE html
html langen
headmeta charsetUTF-8title文件上传/title
/head
bodyh1成功页面/h1divimg srchttp://s3e0wu5bp.hb-bkt.clouddn.com/#(session.picname)/div
/body
/htmlimg标签的src拼接路径是七牛云空间的外链域名文件名 控制器 Controller
public class OneController {//进入测试页面RequestMapping(/show)public String show(){return index;}//文件上传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 iUMJ8ouFFclMTRnz6Us-aZzbP1qoYa4W2-LQL4pk;String secretKey YeSnxdjbjs2DSGuKNIXqH2uva-HGwWcqGdVpWAJi;String bucket programmerdong;//默认不指定key的情况下以文件内容的hash值作为文件名String key null;String name 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值name 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}request.getSession().setAttribute(picname,name);return success;}
}accessKey:七牛云控制台密钥管理AK secretKey:七牛云控制台密钥管理SK bucket自己起的仓库名 上传文件的代码不需要自己写七牛云官方文档中拷贝过来稍作修改即可 右上角导航:文档 --开发者中心 --下拉到最后 --对象存储快速入口 --SDk下载–选择语言查看文档
注册Servlet三大组件
三大组件Servlet、Filter、Listener
方式一注解
pom.xml坐标
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesWebServlet注入Servlet WebServlet(/myservlet)
public class MyServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {System.out.println(进入servlet);resp.getWriter().println(h1Hello Servlet/h1);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req, resp);}
}WebFilter注入Filter WebFilter(urlPatterns {/*})
public class MyFilter implements Filter {public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println(请求过滤);request.setCharacterEncoding(utf-8);//分水岭chain.doFilter(request, response);response.setCharacterEncoding(utf-8);System.out.println(响应过滤);}
}WebListener注入Listener WebListener
public class MyListener implements ServletContextListener {Overridepublic void contextInitialized(ServletContextEvent sce) {System.out.println(ServletContext创建);}Overridepublic void contextDestroyed(ServletContextEvent sce) {System.out.println(ServletContext销毁);}
}程序主启动器还需要添加注解ServletComponentScan SpringBootApplication
ServletComponentScan
public class SpringbootWeb06Application {public static void main(String[] args) {SpringApplication.run(SpringbootWeb06Application.class, args);}
}测试浏览器访问结果 方式二配置类
pom.xml文件与方式一相同存在springboot web环境就可以
配置类的方式不需要再写各自的注解 ServletRegistrationBean注册自定义Servlet FilterRegistrationBean注册自定义Filter ServletListenerRegistrationBean注册自定义Listener 配置类 Configuration
public class MyConfig {//注册Servlet//替换WebServlet(urlPatterns /myServlet)Beanpublic ServletRegistrationBean doServlet() {ServletRegistrationBeanMyServlet bean new ServletRegistrationBeanMyServlet();bean.setServlet(new MyServlet());bean.setUrlMappings(Arrays.asList(/servlet));bean.setLoadOnStartup(1);return bean;}//注册FilterBeanpublic FilterRegistrationBean doFilter(){FilterRegistrationBean filter new FilterRegistrationBean();filter.setFilter(new MyFilter());filter.addUrlPatterns(/*);return filter;}//注册ListenerBeanpublic ServletListenerRegistrationBean doListener(){//关闭监听器切记不要直接点击红色按钮太暴力点击控制台左侧existServletListenerRegistrationBean listener new ServletListenerRegistrationBean();listener.setListener(new MyListener());return listener;}
}Servlet、Filter、Listener和方式一中相同注解去掉 程序的主启动器不需要再添加格外注解 测试结果与方式一相同
切换为其他嵌入式Servlet容器
SpringBoot 默认针对Servlet容器提供以下支持
Tomcat默认使用Jetty 支持长连接项目如聊天页面[ˈdʒeti]Undertow : 不支持 JSP , 但是并发性能高是高性能非阻塞的容器[ˈʌndətəʊ] 默认Tomcat容器 !--在spring-boot-starter-web启动器中默认引入了tomcat容器--
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.1.0.RELEASE/versionscopecompile/scope
/dependency切换Jetty容器 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId!-- 排除tomcat容器 --exclusionsexclusionartifactIdspring-boot-starter-tomcat/artifactIdgroupIdorg.springframework.boot/groupId/exclusion/exclusions
/dependency
!--引入其他的Servlet容器--
dependencyartifactIdspring-boot-starter-jetty/artifactIdgroupIdorg.springframework.boot/groupId
/dependency切换Jetty容器首先需要将tomcat移除在引入其他容器 使用外置Servlet容器omcat9.x 嵌入式Servlet容器运行启动类就可启动或将项目打成可执行的 jar 包 优点简单、快捷 缺点默认不支持JSP、优化定制比较复杂使用定制器, 还需要知道每个功能的底层原理 外置Servlet容器配置 Tomcat, 将项目部署到Tomcat中运行
restFul
REST 指的是一组架构约束条件和原则rest原则有部分组成: URL定位资源HTTP动词操作(GET,POST, PUTDELETE) 描述操作。
满足这些约束条件和原则的应用程序或设计就是 RESTful。
设计RESTful风格的API 在RESTful风格的架构中 每个网址代表一种资源所以网址中不能有动词只能有名词。而且所用的名词往往与数据库的表名对应 HTTP动词设计: GET (获取资源) POST (新建资源) PUT (更新资源客户端提供改变后的完整资源)DELETE (删除资源) 请求方式 含义 GET /zoos 列出所有动物园 POST /zoos 新建一个动物园 GET /zoos/ID 获取某个指定动物园的信息 在spring-boot-starter-web 启动器中默认引入了tomcat容器 PUT /zoos/ID 更新某个指定动物园的信息(提供该动物园的全部信息) DELETE /zoos/ID 删除某个动物园 GET /zoos/lD/animals 列出某个指定动物园的所有动物 DELETE /zoos/lD/animals/ID 删除某个指定动物园的指定动物