龙岗网站建设icxun,广告设计与制作专业大学排名,长沙企业网站建设分公司,com一级域名先通过一个小练习简单了解以下SpringBootWeb。
小练习#xff1a; 需求#xff1a;使用SpringBoot开发一个Web应用#xff0c;浏览器发起请求/hello后#xff0c;给浏览器返回字符串Hello World~。
步骤#xff1a; 1.创建SpringBoot项目#xff0c;勾选We… 先通过一个小练习简单了解以下SpringBootWeb。
小练习 需求使用SpringBoot开发一个Web应用浏览器发起请求/hello后给浏览器返回字符串Hello World~。
步骤 1.创建SpringBoot项目勾选Web相关依赖 2.编写HelloController类添加方法Hello并添加注解 代码演示
RestController
public class HelloController {RequestMapping(/hello)public String HelloController() {System.out.println(Hello World~);return Hello World~;}
} 3.运行SpringBoot的启动类创建完SpringBoot项目后自动创建不用自己创建 代码演示
SpringBootApplication
public class SpringbootWebQuickstartApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWebQuickstartApplication.class, args);}} 运行结果 注意右下角红色框选部分为端口号 4.打开浏览器输入网址localhost8080端口号/hello 运行结果 起步依赖 内嵌Tomcat服务器 Tomcat 官方网站Apache Tomcat® - Welcome!
基本使用 ·部署应用复制到webapps目录。
请求响应
请求 接口测试工具Postman 接受方法
简单参数接收
方法 方法1只需要简单了解下面我对方法23做一下代码演示
方法2代码演示
RestController
public class SimpleParam1 {RequestMapping(/simpleParam1)public String SimpleParam(String name, int age) {System.out.println(name : age);return OK;}}
Postman测试下方运行结果 运行结果 方法3代码演示
RestController
public class SimpleParam2 {RequestMapping(/simpleParam2)public String SimpleParam(RequestParam(name name,required false) String username, int age) {System.out.println(username : age);return OK;}} Postman测试下方运行结果 不传递name 运行结果 实体参数接收
简单实体对象 代码演示
User类
public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name name;this.age age;}/*** 获取* return name*/public String getName() {return name;}/*** 设置* param name*/public void setName(String name) {this.name name;}/*** 获取* return age*/public int getAge() {return age;}/*** 设置* param age*/public void setAge(int age) {this.age age;}public String toString() {return User{name name , age age };}
}
等待处理类
RestController
public class SimplePojo {RequestMapping(/simplePojo)public String simplePojo(User user) {System.out.println(user);return OK;}} Postman测试 运行结果 复杂实体对象 代码演示
User类
package com.han.springbootwebquickstart.pojo;public class User {private String name;private int age;private Address address;public User() {}public User(String name, int age, Address address) {this.name name;this.age age;this.address address;}/*** 获取* return name*/public String getName() {return name;}/*** 设置* param name*/public void setName(String name) {this.name name;}/*** 获取* return age*/public int getAge() {return age;}/*** 设置* param age*/public void setAge(int age) {this.age age;}/*** 获取* return address*/public Address getAddress() {return address;}/*** 设置* param address*/public void setAddress(Address address) {this.address address;}public String toString() {return User{name name , age age , address address };}
}Address类
public class Address {private String province;private String city;public Address() {}public Address(String province, String city) {this.province province;this.city city;}/*** 获取* return province*/public String getProvince() {return province;}/*** 设置* param province*/public void setProvince(String province) {this.province province;}/*** 获取* return city*/public String getCity() {return city;}/*** 设置* param city*/public void setCity(String city) {this.city city;}public String toString() {return Address{province province , city city };}
}
等待处理类
RestController
public class ComplexPojo {RequestMapping(/complexPojo)public String complexPojo(User user) {System.out.println(user);return OK;}} Postman测试 运行结果 数组集合参数接收
1.数组参数 代码演示
RequestMapping(/arrayParam)public String arrayParam(String[] hobby) {System.out.println(Arrays.toString(hobby));return OK;}
Postman测试 运行结果 2.集合参数 请求参数名与形参中集合变量名相同通过RequestParam绑定参数关系。
代码演示
RequestMapping(/listParam)public String listParam(RequestParam ListString hobby) {System.out.println(hobby);return OK;}
Postman测试 运行结果 日期参数 代码演示 RequestMapping(/timeParam)public String timeParam(DateTimeFormat(pattern yyyy-MM-dd HH:mm:ss) LocalDateTime updateTime) {System.out.println(updateTime);return OK;}
Postman测试 运行结果 json参数 代码演示 RequestMapping(/jsonParam)public String jsonParam(RequestBody User user) {System.out.println(user);return OK;}
Postman测试 运行结果 路径参数 代码演示 RequestMapping(/path/{id}/{name})public String pathParam(PathVariable Integer id, PathVariable String name) {System.out.println(id : name);return OK;}
Postman测试 运行结果 响应 代码演示
RestController
public class ResponseController {//返回字符串RequestMapping(/stringResponse)public String stringResponse() {return Hello World;}//返回对象RequestMapping(/pojoResponse)public Address pojoResponse() {return new Address(hebei,shijiazhuang);}//返回集合RequestMapping(/listResponse)public ListAddress listResponse() {ListAddress list new ArrayListAddress();Address address1 new Address(hebei,shijiazhuang);list.add(address1);Address address2 new Address(tianjin,tianjin);list.add(address2);return list;}}
Postman测试结果
返回字符串 返回对象 返回集合 但是这种情况返回的数据过于多样化不便于前端人员处理所以为了规范化一般采取创建Result对象来统一响应结果。
统一响应结果
代码演示
Result类
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic 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(Object data){return new Result(1, success, data);}public static Result success(){return new Result(1, success, null);}public static Result error(String msg){return new Result(0, msg, null);}Overridepublic String toString() {return Result{ code code , msg msg \ , data data };}
}Controller类
RestController
public class ResponseController {//返回字符串RequestMapping(/stringResponse)public Result stringResponse() {return Result.success(Hello World);}//返回对象RequestMapping(/pojoResponse)public Result pojoResponse() {return Result.success(new Address(hebei,shijiazhuang));}//返回集合RequestMapping(/listResponse)public Result listResponse() {ListAddress list new ArrayListAddress();Address address1 new Address(hebei,shijiazhuang);list.add(address1);Address address2 new Address(tianjin,tianjin);list.add(address2);return Result.success(list);}}
Postman测试结果
响应字符串 响应对象 响应集合 案例 加载并解析emp.xml文件中的数据完成数据处理并在页面展示
emp.xml:
?xml version1.0 encodingUTF-8 ?
empsempname金毛狮王/nameage55/ageimagehttps://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg/image!-- 1: 男, 2: 女 --gender1/gender!-- 1: 讲师, 2: 班主任 , 3: 就业指导 --job1/job/empempname白眉鹰王/nameage65/ageimagehttps://web-framework.oss-cn-hangzhou.aliyuncs.com/web/2.jpg/imagegender1/genderjob1/job/empempname青翼蝠王/nameage45/ageimagehttps://web-framework.oss-cn-hangzhou.aliyuncs.com/web/3.jpg/imagegender1/genderjob2/job/empempname紫衫龙王/nameage38/ageimagehttps://web-framework.oss-cn-hangzhou.aliyuncs.com/web/4.jpg/imagegender2/genderjob3/job/emp
/emps代码演示
pom.xml:
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.3.0/versionrelativePath/ !-- lookup parent from repository --/parentgroupIdcom.han/groupIdartifactIdspringboot-web-quickstart/artifactIdversion0.0.1-SNAPSHOT/versionnamespringboot-web-quickstart/namedescriptionspringboot-web-quickstart/descriptionpropertiesjava.version17/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.dom4j/groupIdartifactIddom4j/artifactIdversion2.1.3/version/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/projectEmp类JavaBean
public class Emp {private String name;private Integer age;private String image;private String gender;private String job;public Emp() {}public Emp(String name, Integer age, String image, String gender, String job) {this.name name;this.age age;this.image image;this.gender gender;this.job job;}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 String getImage() {return image;}public void setImage(String image) {this.image image;}public String getGender() {return gender;}public void setGender(String gender) {this.gender gender;}public String getJob() {return job;}public void setJob(String job) {this.job job;}Overridepublic String toString() {return Emp{ name name \ , age age , image image \ , gender gender \ , job job \ };}
}
统一响应结果类Result
public class Result {private Integer code ;//1 成功 , 0 失败private String msg; //提示信息private Object data; //数据 datapublic 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(Object data){return new Result(1, success, data);}public static Result success(){return new Result(1, success, null);}public static Result error(String msg){return new Result(0, msg, null);}Overridepublic String toString() {return Result{ code code , msg msg \ , data data };}
}
Controller类EmpController
RestController
public class EmpController {RequestMapping(/listEmp)public Result list(){//1.加载emp.xml并解析其中的数据String file this.getClass().getClassLoader().getResource(emp.xml).getFile();ListEmp empList XmlParserUtils.parse(file, Emp.class);//2.对员工信息中的gender、job进行修改for (Emp emp : empList) {//设置genderString gender emp.getGender();if(1.equals(gender)){emp.setGender(男);} else if(2.equals(gender)){emp.setGender(女);}//设置jobString 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);}}
前端页面代码
!DOCTYPE html
html langen
headmeta charsetUTF-8meta http-equivX-UA-Compatible contentIEedgemeta nameviewport contentwidthdevice-width, initial-scale1.0title员工信息/title
/headlink relstylesheet hrefelement-ui/index.css
script src./js/vue.js/script
script src./element-ui/index.js/script
script src./js/axios-0.18.0.js/scriptbodyh1 aligncenter员工信息列表展示/h1div idappel-table :datatableData stylewidth: 100% stripe border el-table-column propname label姓名 aligncenter min-width20%/el-table-columnel-table-column propage label年龄 aligncenter min-width20%/el-table-columnel-table-column label图像 aligncenter min-width20%template slot-scopescopeel-image :srcscope.row.image stylewidth: 80px; height: 50px;/el-image/template/el-table-columnel-table-column propgender label性别 aligncenter min-width20%/el-table-columnel-table-column propjob label职位 aligncenter min-width20%/el-table-column/el-table/div
/bodystyle.el-table .warning-row {background: oldlace;}.el-table .success-row {background: #f0f9eb;}
/stylescriptnew Vue({el: #app,data() {return {tableData: []}},mounted(){axios.get(/listEmp).then(res{if(res.data.code){this.tableData res.data.data;}});},methods: {}});
/script
/htmlPortman测试 网页运行结果 分层解耦
Web开发的三层架构 小练习 将上述案例中的Controller代码分解成三层架构代码如下
RestController
public class EmpController {RequestMapping(/listEmp)public Result list(){//1.加载emp.xml并解析其中的数据String file this.getClass().getClassLoader().getResource(emp.xml).getFile();ListEmp empList XmlParserUtils.parse(file, Emp.class);//2.对员工信息中的gender、job进行修改for (Emp emp : empList) {//设置genderString gender emp.getGender();if(1.equals(gender)){emp.setGender(男);} else if(2.equals(gender)){emp.setGender(女);}//设置jobString 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);}}
代码演示
Dao层
接口
public interface EmpDao {public ListEmp listEmp();}实现类
public class EmpDaoA implements EmpDao {Overridepublic ListEmp listEmp() {String file this.getClass().getClassLoader().getResource(emp.xml).getFile();ListEmp empList XmlParserUtils.parse(file, Emp.class);return empList;}
}
Service层
接口
public interface EmpService {public ListEmp listEmp();}
实现类
public class EmpServiceA implements EmpService {private EmpDao empDao new EmpDaoA();Overridepublic ListEmp listEmp() {ListEmp empList empDao.listEmp();for (Emp emp : empList) {//设置genderString gender emp.getGender();if(1.equals(gender)){emp.setGender(男);} else if(2.equals(gender)){emp.setGender(女);}//设置jobString job emp.getJob();if(1.equals(job)){emp.setJob(讲师);} else if(2.equals(job)){emp.setJob(班主任);} else if(3.equals(job)){emp.setJob(就业指导);}}return empList;}
}
Controller层
实现类
RestController
public class EmpController {private EmpService empService new EmpServiceA();RequestMapping(/listEmp)public Result list(){ListEmp empList empService.listEmp();return Result.success(empList);}}
运行结果 内聚和耦合 我们就可以通过控制反转和依赖注入来分层解耦。
控制反转(IOC)和依赖注入(DI) 代码演示
Dao层
接口
public interface EmpDao {public ListEmp listEmp();}实现类
Component
public class EmpDaoA implements EmpDao {Overridepublic ListEmp listEmp() {String file this.getClass().getClassLoader().getResource(emp.xml).getFile();ListEmp empList XmlParserUtils.parse(file, Emp.class);return empList;}
}
Service层
接口
public interface EmpService {public ListEmp listEmp();}
实现类
Component
public class EmpServiceA implements EmpService {Autowiredprivate EmpDao empDao;Overridepublic ListEmp listEmp() {ListEmp empList empDao.listEmp();for (Emp emp : empList) {//设置genderString gender emp.getGender();if(1.equals(gender)){emp.setGender(男);} else if(2.equals(gender)){emp.setGender(女);}//设置jobString job emp.getJob();if(1.equals(job)){emp.setJob(讲师);} else if(2.equals(job)){emp.setJob(班主任);} else if(3.equals(job)){emp.setJob(就业指导);}}return empList;}
}
Controller层
实现类
RestController
public class EmpController {Autowiredprivate EmpService empService ;RequestMapping(/listEmp)public Result list(){ListEmp empList empService.listEmp();return Result.success(empList);}}
运行结果 好处 采用这种方式降低了层之间的耦合度如果业务逻辑改变要使用Service层中的其他实现类那只需要编写好新的实现类后在类上标注注解Component再修改原来使用的实现类的注解即可。
IOC细节
Bean的声明 目前主要使用的是下图中下面三个针对一个类的注解Component一般只有在一个类不属于这三类的时候使用。 注意 声明bean的时候可以通过value属性指定bean的名字如果没有指定默认为类名首字母小写。 使用以上四个注解都可以声明bean但是在springboot集成web开发中声明控制器bean只能用Controller。
Bean组件扫描 DI细节
Bean注入 ★Resource与Autowired的区别 ·Autowired是spring框架提供的注解而Resource是JDK提供的注解 ·Autowired默认是按照类型注入而Resource默认是按照名称注入