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

网站稳定性不好的原因打金新开传奇网站

网站稳定性不好的原因,打金新开传奇网站,南头企业网站建设公司,网站制作的步骤不包括目录 前言请求PostmanPostman使用 简单参数原始方式接收普通参数SpringBoot方式接收普通参数参数名不一致问题 实体参数简单实体参数复杂实体对象 数组集合参数数组参数集合参数 日期参数JSON参数路径参数 响应ResponseBody统一响应结果请求响应案例案例需求与准备工作案例实现… 目录 前言请求PostmanPostman使用 简单参数原始方式接收普通参数SpringBoot方式接收普通参数参数名不一致问题 实体参数简单实体参数复杂实体对象 数组集合参数数组参数集合参数 日期参数JSON参数路径参数 响应ResponseBody统一响应结果请求响应案例案例需求与准备工作案例实现测试与问题 前言 之前我们基于SpringBoot的方式开发了一个web应用浏览器发起请求 /hello 后 给浏览器返回字符串 “Hello World ~”。 其实是我们在浏览器发起请求请求了我们的后端web服务器(也就是内置的Tomcat)。而我们在开发web程序时呢定义了一个控制器类Controller请求会被部署在Tomcat中的Controller接收然后Controller再给浏览器一个响应响应一个字符串 “Hello World”。 而在请求响应的过程中是遵循HTTP协议的。 其实在Tomcat这类Web服务器中是不识别我们自己定义的Controller的。但是Tomcat是一个Servlet容器是支持Serlvet规范的所以呢在tomcat中是可以识别 Servlet程序的。 那我们所编写的XxxController 是如何处理请求的又与Servlet之间有什么联系呢 其实呢在SpringBoot进行web程序开发时它内置了一个核心的Servlet程序DispatcherServlet称之为 核心控制器。 DispatcherServlet 负责接收页面发送的请求然后根据执行的规则将请求再转发给后面的请求处理器Controller请求处理器处理完请求之后最终再由DispatcherServlet给浏览器响应数据。 那将来浏览器发送请求会携带请求数据包括请求行、请求头请求到达tomcat之后tomcat会负责解析这些请求数据然后呢将解析后的请求数据会传递给Servlet程序的HttpServletRequest对象那也就意味着 HttpServletRequest 对象就可以获取到请求数据。 而Tomcat还给Servlet程序传递了一个参数 HttpServletResponse通过这个对象我们就可以给浏览器设置响应数据 。 请求 本章节主要讲解如何接收页面传递过来的请求数据。 Postman 由于前后端分离对我们后端技术人员来讲在开发过程中是没有前端页面的那我们怎么测试自己所开发的程序呢 方式1像之前SpringBoot入门案例中一样直接使用浏览器。在浏览器中输入地址测试后端程序。 弊端在浏览器地址栏中输入地址这种方式都是GET请求如何我们要用到POST请求怎么办呢 要解决POST请求需要程序员自己编写前端代码比较麻烦方式2使用专业的接口测试工具我们使用Postman工具 Postman使用 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 可以模拟浏览器向后端服务器发起任何形式(如:get、post)的HTTP请求。 使用Postman还可以在发起请求时携带一些请求参数、请求头等信息。 登录之后可以创建工作空间 创建请求 点击Save可以保存当前请求 简单参数 简单参数在向服务器发起请求时向服务器传递的是一些普通的请求数据。 在后端程序中如何接收传递过来的普通参数数据呢 在这里讲解两种方式 原始方式SpringBoot方式 原始方式接收普通参数 这种方式仅做了解开发不常用。 在原始的Web程序当中需要通过Servlet中提供的APIHttpServletRequest请求对象获取请求的相关信息。比如获取请求参数 Tomcat接收到http请求时把请求的相关信息封装到HttpServletRequest对象中在Controller中我们要想获取Request对象可以直接在方法的形参中声明 HttpServletRequest 对象。然后就可以通过该对象来获取请求信息 RestController public class RequestController {//原始方式RequestMapping(/simpleParam)public String simpleParam(HttpServletRequest request) { // http://localhost:8080/simpleParam?nameTomage10 // 请求参数 nameTomage10 有2个请求参数 // 第1个请求参数 nameFranklin 参数名:name参数值:Franklin // 第2个请求参数 age10 参数名:age , 参数值:10String name request.getParameter(name);//name就是请求参数名String ageStr request.getParameter(age);//age就是请求参数名int age Integer.parseInt(ageStr);//需要手动进行类型转换System.out.println(name : age);return OK;} }//根据指定的参数名获取请求参数的数据值 String request.getParameter(参数名)SpringBoot方式接收普通参数 在Springboot的环境中对原始的API进行了封装接收参数的形式更加简单。 如果是简单参数参数名与形参变量名相同定义同名的形参即可接收参数。 RestController public class RequestController {// http://localhost:8080/simpleParam?nameTomage10 // 第1个请求参数 nameFranklin 参数名:name参数值:Franklin // 第2个请求参数 age10 参数名:age , 参数值:10 //springboot方式RequestMapping(/simpleParam)public String simpleParam(String name , Integer age ){//形参名和请求参数名保持一致System.out.println(name : age);return OK;} }postman测试( GET 请求) postman测试( POST请求 ) 结论不论是GET请求还是POST请求对于简单参数来讲只要保证请求参数名和Controller方法中的形参名保持一致就可以获取到请求参数中的数据值。 参数名不一致问题 如果方法形参名称与请求参数名称不一致controller方法中的形参还能接收到请求参数值吗 RestController public class RequestController {// http://localhost:8080/simpleParam?nameTomage20 // 请求参数名name //springboot方式RequestMapping(/simpleParam)public String simpleParam(String username , Integer age ){//请求参数名和形参名不相同System.out.println(username : age);return OK;} }答案运行没有报错。 controller方法中的username值为nullage值为20 结论对于简单参数来讲请求参数名和controller方法中的形参名不一致时无法接收到请求 数据 那么如果我们开发中遇到了这种请求参数名和controller方法中的形参名不相同怎么办 解决方案可以使用Spring提供的RequestParam注解完成映射。 在方法形参前面加上 RequestParam 然后通过value属性执行请求参数名从而完成映射。代码如下 RestController public class RequestController {// http://localhost:8080/simpleParam?nameTomage20 // 请求参数名name //springboot方式RequestMapping(/simpleParam)public String simpleParam(RequestParam(name) String username, Integer age ){System.out.println(username : age);return OK;} }注意 RequestParam中的required属性默认为true默认值也是true代表该请求参数必须传递如果不传递将报错、 如果该参数是可选的可以将required属性设置为false: RequestMapping(/simpleParam)public String simpleParam(RequestParam(name name, required false) String username, Integer age){System.out.println(username : age);return OK;}实体参数 在使用简单参数做为数据传递方式时前端传递了多少个请求参数后端controller方法中的形参就要书写多少个。如果请求参数比较多通过上述的方式一个参数一个参数的接收会比较繁琐。 此时我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装需要遵守如下规则 请求参数名与实体类的属性名相同 简单实体参数 定义实体类 public class User {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}Overridepublic String toString() {return User{ name name \ , age age };} }Controller方法 RestController public class RequestController {//实体参数简单实体对象RequestMapping(/simplePojo)public String simplePojo(User user) {System.out.println(user);return OK;} }Postman测试参数名和实体类属性名一致时正常输出参数名和实体类属性名不一致时不一致的参数名输出的是null。 复杂实体对象 复杂实体对象指的是在实体类中有一个或多个属性也是实体对象类型的。如下 User类中有一个Address类型的属性Address是一个实体类 复杂实体对象的封装需要遵守如下规则 请求参数名与形参对象属性名相同按照对象层次结构关系即可接收嵌套实体类属性参数。 定义POJO实体类,Address实体类: public class Address {private String province;private String city;public String getProvince() {return province;}public void setProvince(String province) {this.province province;}public String getCity() {return city;}public void setCity(String city) {this.city city;}Overridepublic String toString() {return Address{ province province \ , city city \ };} }User实体类 public class User {private String name;private Integer age;private Address address; //地址对象public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address address;}Overridepublic String toString() {return User{ name name \ , age age , address address };} }Controller方法 RestController public class RequestController {//实体参数复杂实体对象RequestMapping(/complexPojo)public String complexPojo(User user){System.out.println(user);return OK;} }Postman测试 数组集合参数 数组集合参数的使用场景在HTML的表单中有一个表单项是支持多选的(复选框)可以提交选择的多个值。 实多个值也是一个一个的提交: 后端程序接收上述多个值的方式有两种 数组集合 数组参数 数组参数请求参数名与形参数组名称相同且请求参数为多个定义数组类型形参即可接收参数 Controller方法 RestController public class RequestController {//数组集合参数RequestMapping(/arrayParam)public String arrayParam(String[] hobby){System.out.println(Arrays.toString(hobby));return OK;} }Postman测试 在前端请求时有两种传递形式 方式一 xxxxxxxxxx?hobbygamehobbyjava 方式二xxxxxxxxxxxxx?hobbygame,java 集合参数 集合参数请求参数名与形参集合对象名相同且请求参数为多个需要使用RequestParam 绑定参数关系 默认情况下请求中参数名相同的多个值是封装到数组。如果要封装到集合要使用RequestParam绑定参数关系 Controller方法 RestController public class RequestController {//数组集合参数RequestMapping(/listParam)public String listParam(RequestParam ListString hobby){System.out.println(hobby);return OK;} }Postman测试 方式一 xxxxxxxxxx?hobbygamehobbyjava 方式二xxxxxxxxxxxxx?hobbygame,java 日期参数 在一些特殊的需求中可能会涉及到日期类型数据的封装。比如如下需求 因为日期的格式多种多样如2022-12-12 10:05:45 、2022/12/12 10:05:45那么对于日期类型的参数在进行封装的时候需要通过DateTimeFormat注解以及其pattern属性来设置日期的格式 DateTimeFormat注解的pattern属性中指定了哪种日期格式前端的日期参数就必须按照指定的格式传递。 后端controller方法中需要使用Date类型或LocalDateTime类型来封装传递的参数。Controller方法 RestController public class RequestController {//数组集合参数RequestMapping(/listParam)public String listParam(RequestParam ListString hobby) {System.out.println(hobby);return OK;}//日期时间参数RequestMapping(/dateParam)public String dateParam(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDateTime updateTime) {System.out.println(updateTime);return OK;} }Postman测试 JSON参数 在前后端进行交互时如果是比较复杂的参数前后端通过使用JSON格式的数据进行传输。 JSON是开发中最常用的前后端数据交互方式 Postman如何发送JSON格式数据 服务端Controller方法如何接收JSON格式数据 1.传递json格式的参数在Controller中会使用实体类进行封装。 2.封装规则JSON数据键名与形参对象属性名相同定义POJO类型形参即可接收参数。需要使用RequestBody标识。 RequestBody注解将JSON数据映射到形参的实体类对象中JSON中的key和实体类中的属性名保持一致 上图实体类省略了GET , SET 方法。Controller方法 RestController public class RequestController {//JSON参数RequestMapping(/jsonParam)public String jsonParam(RequestBody User user){System.out.println(user);return OK;} }Postman测试 经测试GET和POST命令都可以但是Postman上的数据类型必须从text改成json 路径参数 传统的开发中请求参数是放在请求体(POST请求)传递或跟在URL后面通过?keyvalue的形式传递(GET请求)。 在现在的开发中经常还会直接在请求的URL中传递参数。例如 http://localhost:8080/user/1 http://localhost:880/user/1/0上述的这种传递请求参数的形式称之为路径参数。 前端通过请求URL直接传递参数 后端使用{…}来标识该路径参数需要使PathVariable获取路径参数Controller方法 RestController public class RequestController {//路径参数RequestMapping(/path/{id})public String pathParam(PathVariable Integer id){System.out.println(id);return OK;} }Postman测试 传递多个路径参数 Controller方法 RestController public class RequestController {//路径参数RequestMapping(/path/{id}/{name})public String pathParam2(PathVariable Integer id, PathVariableString name){System.out.println(id : name);return OK;} }Postman 响应 Controller程序除了接收请求外还可以进行响应。 ResponseBody 在我们前面所编写的controller方法中都已经设置了响应数据。 controller方法中的return的结果怎么就可以响应给浏览器呢因为我们使用了ResponseBody注解。 但是在我们所书写的Controller中只在类上添加了RestController注解、方法添加了RequestMapping注解并没有使用ResponseBody注解怎么给浏览器响应呢 我们前面说过RestController代表该类是请求处理类其是一个组合注解 RestController Controller ResponseBody 可以看一下RestController的源码 Target({ElementType.TYPE}) //元注解修饰注解的注解 Retention(RetentionPolicy.RUNTIME) //元注解 Documented //元注解 Controller ResponseBody public interface RestController {AliasFor(annotation Controller.class)String value() default ; }ResponseBody注解 类型方法注解、类注解 位置书写在Controller方法上或类上 作用将方法返回值直接响应给浏览器 如果返回值类型是实体对象/集合将会转换为JSON格式后在响应给浏览器下面我们来测试下响应数据 RestController public class ResponseController {//响应字符串RequestMapping(/hello)public String hello(){System.out.println(Hello World ~);return Hello World ~;}//响应实体对象RequestMapping(/getAddr)public Address getAddr(){Address addr new Address();//创建实体类对象addr.setProvince(广东);addr.setCity(深圳);return addr;}//响应集合数据RequestMapping(/listAddr)public ListAddress listAddr(){ListAddress list new ArrayList();//集合对象Address addr new Address();addr.setProvince(广东);addr.setCity(深圳);Address addr2 new Address();addr2.setProvince(陕西);addr2.setCity(西安);list.add(addr);list.add(addr2);return list;} }在服务端响应了一个对象或者集合那私前端获取到的数据是什么样子的呢我们使用postman发送请求来测试下。测试效果如下可以看到返回的是JSON 统一响应结果 前面所编写的这些Controller方法中返回值各种各样没有任何的规范。 在真实的项目开发中无论是哪种方法我们都会定义一个统一的返回结果。前端只需要按照统一格式的返回结果进行解析(仅一种解析方案)就可以拿到数据。方案如下 定义在一个实体类Result来包含以上信息。代码如下 public class Result {private Integer code;//响应码1 代表成功; 0 代表失败private String msg; //响应码 描述字符串private Object data; //返回的数据public Result() {}public Result(Integer code, String msg, Object data) {this.code code;this.msg msg;this.data data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg msg;}public Object getData() {return data;}public void setData(Object data) {this.data data;}//增删改 成功响应(不需要给前端返回数据)public static Result success() {return new Result(1, success, null);}//查询 成功响应(把查询结果做为返回数据响应给前端)public static Result success(Object data) {return new Result(1, success, data);}//失败响应public static Result error(String msg) {return new Result(0, msg, null);} }改造Controller RestController public class ResponseController {//响应统一格式的结果RequestMapping(/hello)public Result hello(){System.out.println(Hello World ~); //return new Result(1,success,Hello World ~);return Result.success(Hello World ~);}//响应统一格式的结果RequestMapping(/getAddr)public Result getAddr(){Address addr new Address();addr.setProvince(广东);addr.setCity(深圳);return Result.success(addr);}//响应统一格式的结果RequestMapping(/listAddr)public Result listAddr(){ListAddress list new ArrayList();Address addr new Address();addr.setProvince(广东);addr.setCity(深圳);Address addr2 new Address();addr2.setProvince(陕西);addr2.setCity(西安);list.add(addr);list.add(addr2);return Result.success(list);} }Postman测试 请求响应案例 通过一个案例来加强对请求响应的学习 案例需求与准备工作 需求加载并解析xml文件中的数据完成数据处理并在页面展示 案例准备 XML文件 已经准备好(emp.xml)直接导入进来放在 src/main/resources目录下工具类 已经准备好解析XML文件的工具类无需自己实现 直接在创建一个包 com.itheima.utils 然后将工具类拷贝进来前端页面资源 已经准备好直接拷贝进来放在src/main/resources下的static目录下 Springboot项目的静态资源(htmlcssjs等前端资源)默认存放目录为classpath:/static、 classpath:/public、 classpath:/resources 在SpringBoot项目中静态资源默认可以存放的目录 classpath:/static/ classpath:/public/ classpath:/resources/ classpath:/META-INF/resources/classpath 代表的是类路径在maven的项目中其实指的就是 src/main/resources 或者 src/main/java但是java目录是存放java代码的所以相关的配置文件及静态资源文 档就放在 src/main/resources下。案例实现 在pom.xml文件中引入dom4j的依赖用于解析XML文件 dependency groupIdorg.dom4j/groupId artifactIddom4j/artifactId version2.1.3/version /dependency2.引入资料中提供的解析XML的工具类XMLParserUtils、实体类Emp、XML文件emp.xml 3.引入资料中提供的静态页面文件放在resources下的static目录下 创建EmpController类编写Controller程序处理请求响应数据 Contriller代码 RestController public class EmpController {RequestMapping(/listEmp)public Result list() {//1. 加载并解析emp.xmlString file this.getClass().getClassLoader().getResource(emp.xml).getFile();//System.out.println(file);ListEmp empList XmlParserUtils.parse(file, Emp.class);//2. 对数据进行转换处理 - gender, jobempList.stream().forEach(emp - {//处理 gender 1: 男, 2: 女String gender emp.getGender();if (1.equals(gender)) {emp.setGender(男);} else if (2.equals(gender)) {emp.setGender(女);}//处理job - 1: 讲师, 2: 班主任 , 3: 就业指导String job emp.getJob();if (1.equals(job)) {emp.setJob(讲师);} else if (2.equals(job)) {emp.setJob(班主任);} else if (3.equals(job)) {emp.setJob(就业指导);}});//3. 响应数据return Result.success(empList);} }ps: String file this.getClass().getClassLoader().getResource(emp.xml).getFile(); 这个语句用到了类加载器(getClassLoader())来获取emp.xml什么原理呢在Java的resources文件夹src/main/resources文件夹下的内容会被打包到生成的JAR或者WAR文件中因此这些资源文件会被ClassLoader加载。在我们的代码中this.getClass().getClassLoader().getResource(emp.xml).getFile() 这句代码的作用是通过类加载器获取emp.xml文件的路径。 这里的getClassLoader()方法是java.lang.Class类的一个方法用于获取类的ClassLoader。 getResource(emp.xml)方法会在类路径下查找名为emp.xml的文件并返回一个表示该资源的URL对象。 最后getFile()方法获取该URL的文件表示形式即文件的路径。由于emp.xml位于resources文件夹下它会被编译到类路径中。因此通过类加载器就可以获取到这个文件的路径。 这种方式通常用于获取类路径下的配置文件、模板文件等资源。 当应用程序打包成可执行的JAR文件时这种方式仍然适用因为resources文件夹中的内容会被包含在JAR文件中ClassLoader可以正确地加载这些资源。测试与问题 代码编写完毕运行引导类启动服务进行测试了。Postman测试 打开浏览器在浏览器地址栏输入localhost:8080/emp.html 上述案例的功能虽然已经实现但是解析XML数据获取数据的代码处理数据的逻辑的代码给页面响应的代码全部都堆积在一起了全部都写在controller方法中了。 当前程序的这个业务逻辑还是比较简单的如果业务逻辑再稍微复杂一点我们会看到Controller方法的代码量就很大了。 当我们要修改操作数据部分的代码需要改动Controller 当我们要完善逻辑处理部分的代码需要改动Controller 当我们需要修改数据响应的代码还是需要改动Controller这样呢就会造成我们整个工程代码的复用性比较差而且代码难以维护。 其实在现在的开发中有非常成熟的解决思路那就是分层开发。
http://www.pierceye.com/news/647250/

相关文章:

  • 做网站怎么上传图片厦门建站网址费用
  • 网站设计方案和技巧做设计有必要买素材网站会员吗
  • 成都制作网站软件网站别人帮做的要注意什么东西
  • 徐州建筑网站建网站要自己买服务器吗
  • 网站订单系统模板专业的做网站公司
  • 怎么做加盟美容院网站黄骅港开发区
  • 品牌高端网站制作官网做网站用的小图标
  • 成都网站设计合理柚v米科技泉州建设公司
  • 网页制作与网站建设完全学习手册软件下载网站怎么做
  • linux系统网站空间如何分析网站关键词
  • 以下属于网站页面设计的原则有查询网站空间商
  • 建设银行网站链接网络推广有哪些常见的推广方法
  • 常州网络公司网站图片在线制作加字
  • 漕泾网站建设建立内部网站
  • 海宁市住房和城乡规划建设局网站北京十大装饰装修公司
  • 创新的常州做网站网站页面设计公司电话
  • 建站公司见客户没话说周年庆网站要怎么做
  • 建设银行网站字体建设官方网站
  • 建设部网站人员查询商城网站 没有什么文章 怎样优化
  • wordpress按标签筛选广州seo网站
  • 南宁手机建站公司常德网站开发服务
  • 智能锁东莞网站建设php网站开发需要学什么软件
  • 扒网站样式中国搜索网站排名
  • 网站空间和云服务器建设建材网站费用
  • 公司网站 正式上线wordpress 移动端不显示
  • 旅行网站排名前十名网站检测报告哪里做
  • 随州做网站wordpress 显示评论内容
  • 网站建设时间计划表非常赚又一个wordpress站点
  • 苏州网站小程序app开发公司wordpress如何上传文件大小
  • 同仁行业网站建设报价免费ui网站