当前位置:   article > 正文

JavaWeb:vue、AJax、ELement、maven、SpringBoot、、Http、Tomcat、请求响应、分层解耦

JavaWeb:vue、AJax、ELement、maven、SpringBoot、、Http、Tomcat、请求响应、分层解耦

1 Vue

1.1 Vue介绍

VUE是前端框架,基于MVVM,实现数据双向绑定

框架是半基础软件,可重用的代码模型

f5aa5f91afbc4dc6821b1f8bef094523.png

1.2 Vue指令

  1. <script src="js/vue.js"></script>
  2. </head>
  3. <body>
  4. <div id="id">
  5. <!-- 绑定了一个数据模型,vue双向绑定 -->
  6. <input type="text" v-model="url">
  7. <!-- v-bind绑定属性值 -->
  8. <!-- v-model在表单元素创建双向数据绑定 -->
  9. <a :href="url">链接1</a>
  10. <a v-bind:href="url">链接2</a>
  11. <!-- 插值表达式 -->
  12. {{msg}}
  13. <input type="button" value="按钮" v-on:click="handle()">
  14. <!-- 简化写法 -->
  15. <input type="button" value="按钮" @click="handle()">
  16. <!-- 判定为true就渲染 -->
  17. <span v-if="msg <= 30">30</span>
  18. <span v-else-if="msg> 30&&msg<50">30</span>
  19. <!-- 不管条件都渲染,不满足条件display隐藏 -->
  20. <span v-show="msg <= 30">340</span>
  21. <div v-for="ar in arr">{{ar}}</div>
  22. <div v-for="(ar1,in1) in arr">{{in1}}:{{ar1}}</div>
  23. </div>
  24. </body>
  25. <script >
  26. // 在new vue传递一个对象,el表示接管<div id="id"></div>区域
  27. new Vue({
  28. el:"#id",
  29. data:{
  30. url:"https://www.bilibili.com/",
  31. msg:20,
  32. arr:[1,2]
  33. },
  34. methods:{
  35. handle:function(){
  36. alert('hanle');
  37. }
  38. }
  39. })
  40. </script>

1.3 生命周期

156dc2d74715449d97129a4ced2d1096.png

  1. <div id="id"></div>
  2. </body>
  3. <script >
  4. // 在new vue传递一个对象,el表示接管<div id="id"></div>区域
  5. new Vue({
  6. el:"#id",
  7. data:{
  8. url:"https://www.bilibili.com/",
  9. msg:20,
  10. arr:[1,2]
  11. },
  12. mounted(){
  13. alert('vue初始化成功, HTML页面渲染成功,发送请求到服务端,加载数据')
  14. }
  15. })
  16. </script>

326ef1a974754a199dd23d2fe5cb3c76.png

1.4 Vue-cli

 Vue-cli 是Vue官方提供的一个脚手架,用于快速生成一个 Vue 的项目模板

1 统一的目录结构

2 本地调试

3 热部署:代码变动,不需要重新运行,就可以加载最新的程序

4 单元测试

5 集成打包上线

1.5 目录结构 

be3f0020464f40d6803fe3fc0619a007.png

 1.6 前端工程化

Day03-05. 前端工程化-Vue项目_哔哩哔哩_bilibili创建vue文件

启动vue文件

3280f3ee0b54476d85d1db080f5fa832.png

vue.config.js

  1. //修改端口号由80807000
  2.   devServer: {
  3.     port: 7000,
  4.   }

main.js

  1. import Vue from 'vue'
  2. //import App from './App.vue'表示要把App.vue导入当前js文件,命名为App
  3. import App from './App.vue'
  4. import router from './router'
  5. Vue.config.productionTip = false
  6. new Vue({
  7. //ES6语法,router:router两个属性名一致,可以简写为一个router
  8. router,
  9. //render函数作用:将上面导入的app创建的视图创建虚拟DOM元素挂载到#app区域,这部分DOM元素是在App.vue的根组件定义的
  10. render: h => h(App)
  11. }).$mount('#app')
  12. // 相当于一下代码
  13. new Vue({
  14. el:"#app",
  15. router:router,
  16. render:h=>h(App)
  17. })

1.7 制作组件文件

App.vue

  1. <!-- 模板部分,生成html代码 -->
  2. <template>
  3. <div>{{ msg }}</div>
  4. </template>
  5. <!-- 控制模板的数据来源和行为 -->
  6. <script>
  7. //export导出一个模块,那么其他地方也可以导入
  8. export default {
  9. data:function(){
  10. // {}是对象,msg是数据模型
  11. return{
  12. msg:"haha"
  13. }
  14. }
  15. }
  16. </script>
  17. <style>
  18. </style>

2343f3ee46924e4e87de92a42466601e.png

2 Element

Element - 网站快速成型工具

配置Element后:

elementView.vue

  1. <template>
  2. <div>
  3. <el-row>
  4. <el-button>默认按钮</el-button>
  5. <el-button type="primary">主要按钮</el-button>
  6. <el-button type="success">成功按钮</el-button>
  7. <el-button type="info">信息按钮</el-button>
  8. <el-button type="warning">警告按钮</el-button>
  9. <el-button type="danger">危险按钮</el-button>
  10. </el-row>
  11. </div>
  12. </template>
  13. <script>
  14. export default{
  15. }</script>
  16. <style></style>

main.js新增:

  1. import ElementUI from 'element-ui';
  2. import 'element-ui/lib/theme-chalk/index.css';
  3. Vue.use(ElementUI);

App.vue 

  1. <template>
  2. <div>
  3. <element-view></element-view>
  4. </div>
  5. </template>
  6. <!-- 控制模板的数据来源和行为 -->
  7. <script>
  8. import elementView from './views/element/elementView.vue';
  9. //export导出一个模块,那么其他地方也可以导入
  10. export default {
  11. components:{elementView},
  12. }
  13. </script>
  14. <style>
  15. </style>

ec5f11ce30cf4162a518012892d5473d.png

3 vue-router

VueRouter路由器类

router/index.js 改变:

  1. const routes = [
  2. {
  3. path: '/',
  4. redirect:'/ele'
  5. },
  6. {
  7. path: '/ele',
  8. name: 'ele',
  9. component: () => import(/* webpackChunkName: "about" */ '../views/element/elementView.vue')
  10. }
  11. ]

elementView.vue新增: 

  1. <template>
  2. <div>
  3. //router-link解析成a
  4. <router-link to="/ele">点我试试?</router-link>
  5. //渲染相对应组件
  6. <router-view></router-view>
  7. </el-row>
  8. </div>
  9. </template>

4 ngnix

594af69ce9f340e89014389fda5e7c41.png

打包后放在dist文件夹里

将dist文件夹里面的东西放入fa8a51bb802143179b99172ebe2cd68d.png

c47efba7d02d4ce4a40c9c17e9a6b785.png 打开nginx.exe

输入http://localhost:90/

5 Ajax

5.1 作用

1 异步交互:不重新加载页面,与服务器交换数据并更新网页,比如搜索联想

2 数据交换:通过Ajax可以给服务器发送请求,并获取数据

5.2 原生Ajax

  1. <body>
  2.     <input type="button" value="获取数据" onclick="getData()">
  3. <div id="div1"></div></body>
  4. <script>
  5.     function getData(){
  6.         //1. 创建XMLHttpRequest
  7.         var xmlHttpRequest  = new XMLHttpRequest();
  8.         //2. 发送异步请求
  9.         xmlHttpRequest.open('GET','http://yapi.smart-xwork.cn/mock/169327/emp/list');
  10.         xmlHttpRequest.send();//发送请求
  11.         //3. 获取服务响应数据
  12.         xmlHttpRequest.onreadystatechange = function(){
  13.             if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
  14.             //获取响应的数据,然后放到div1这个区域中
  15.     document.getElementById('div1').innerHTML = xmlHttpRequest.responseText;
  16.             }
  17.         }
  18.     }
  19. </script>

5.3 Axios

对原生Ajax进行封装

Axios中文文档 | Axios中文网 (axios-http.cn)

  1. <body>
  2. <input type="button" value="获取数据" onclick="get()">
  3. <input type="button" value="提交数据" onclick="post()">
  4. <script>
  5. function get(){
  6. // 通过axios发送异步请求get
  7. axios({
  8.     method: "get",
  9. // 传递数据可以在url后面"?key=word"
  10.     url: "https://yapi.pro/mock/293482/User/id"
  11. //想获取服务器端相应回来的数据,用成功回调函数then((result) =>xxx
  12. }).then((result) => {
  13.     console.log(result.data);
  14. });
  15. // 简化版本
  16. // axios.get("http://yapi.smart-xwork.cn/mock/169327/emp/list").then((result) => {
  17. //     console.log(result.data);
  18. // });
  19. }
  20. function post(){
  21. axios({
  22.     method: "post",
  23.     url: "https://yapi.pro/mock/293482/User/id",
  24.     data: "height=199"
  25. }).then((result) => {
  26.     console.log(result.data);
  27. });
  28. // 简化版本
  29. // axios.post( "http://yapi.smart-xwork.cn/mock/169327/emp/deleteById","id=1").then((result) => {
  30. //     console.log(result.data);
  31. // });
  32. }
  33. </script>
  34. </body>

点击获取数据:

370f0e8792f24ef38662ec2f6b5a8947.png

api接口文档管理平台Yapi

YApi Pro-高效、易用、功能强大的可视化接口管理平台

作用:1 api接口管理 2Mock:模拟真实接口,生成模拟测试数据

创建了我的api:
8dee7bbde89846db995686426e2cc3f2.png

6 Maven

6.1 介绍

1 依赖管理,管理jar包

2 统一结构,不同编译器生成的结构可能不同

3 自动化项目构建,根据指令快速完成清理、编译、测试、打包、发布

2b47838aa34546699ba0c0ca128a2216.png

不同阶段有不同文件产生,编译时有编译字节码文件,打包有jar文件 

70cb8c2fbd204ffe9c4b3beec1aba8fa.png

项目对象模型POM,或者称为坐标

6e9ec2aa63934cd185ba49c979a5f9d1.png

d9a6617560ed4d9e8bba9c8677f3de92.png

 依赖管理模型

6.2 依赖管理

6.2.1 创建依赖

Maven Repository: Search/Browse/Explore (mvnrepository.com)

pom.xml

  1. <dependencies>
  2. <dependency>
  3. //依赖ch.qos.logback下的logback-classic
  4. <groupId>ch.qos.logback</groupId>
  5. <artifactId>logback-classic</artifactId>
  6. <version>1.2.3</version>
  7. </dependency>
  8. </dependencies>

6.2.2 依赖传递

9d231441accb49e2941003850b1f7a88.png

查看依赖关系 

c7c20e331c784ed5a63cc8cb9b88678d.png

解除依赖:

  1. <dependencies>
  2. <dependency>
  3. <exclusions>
  4. <groupId>ch.qos.logback</groupId>
  5. <artifactId>logback-classic</artifactId>
  6. </exclusions>
  7. </dependency>
  8. </dependencies>

 6.2.3 依赖范围

513697b5b27148ef93cdb5ed6bec5b53.png

  1. <dependencies>
  2. <dependency>
  3. //依赖ch.qos.logback下的logback-classic
  4. <groupId>ch.qos.logback</groupId>
  5. <artifactId>logback-classic</artifactId>
  6. <version>1.2.3</version>
  7. <scope>test</scope>
  8. </dependency>
  9. </dependencies>

6.2.3 生命阶段

050fb392ae7f4f0c99b9d3a94a7b3229.png

7 SpringBoot 

创建一个SpringBoot工程

2d538b4296354a4685dea7d0522044ed.png

HelloController
  1. //请求处理类
  2. @RestController
  3. public class HelloController {
  4. //访问/hello会使用以下方法
  5. @RequestMapping("/hello")
  6. public String Hello(){
  7. System.out.println("hello1");
  8. return "hello";
  9. }
  10. }

运行Springbootdemo1Application

f7da921d36e04a52bc26cfe7ca35751f.png

ea1d5813ac224c4abed91a11cc287b3a.png

成功!

8 HTTP协议

 Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

HTTP协议是无状态的协议:每次请求-响应都是独立的

1aa1e84689644a8eb209c97b13bf72cb.png

11fe05bd604b439288ef9175121f7ec8.png HTTP响应格式ca16bf7bf6d74a02b61dfd578afcd610.png

Web服务器是一个软件程序,对HTTP协议的操作进行封装 

9 Tomcat

Tomcat(Web容器、Servlet容器)是轻量级Web服务器,支持Servlet/JSP少量JavaEE规
JavaEE:Java企业版
Servlet程序需要依赖于 Tomcat才能运行
72653b4f4abb4956802aa66e87e8e2dc.png

解决乱码:tomcat文件夹 

91d7770bac9f4ccb8b89062650a74e38.png

bf8dea50277f4e1eacdd32cf357df32d.png 解决占用端口

f834e013547942cf8fce1dbab7bcec6e.png

 cmd

  1. netstat -ano | findstr 8080
  2. taskkill -pid LISTENING占用的pid的数字 -f

53df8a9b71a94863b73bd7cf2e48890b.png

 HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号

改端口号

588aa0e3ddb64385bcc5f40d2e4a2136.png

39ee496820054fe8aeb89f1a916b71c7.png

Tomcat 部署项目:将项目放置到 webapps 目录下
访问方法:localhost:8080/文件夹中的html文件

起步依赖:

1.spring-boot-starter-web:包含了web应用开发所需要的常见依赖

2.spring-boot-starter-test:包含了单元测试所需要的常见依赖

不需要加version,因为在<parent>父工程定义好了

https://docs.spring.io/spring-boot/docs/2.7.4/reference/htmlsingle/#using.build-systems.starters

 基于Springboot开发的web应用程序,内置了tomcat服务器,当启动类运行时,会自动启动内嵌的tomcat服务器

10 请求响应

10.1 请求HttpServletRequest

  1. @RestController
  2. public class simpleParam {
  3. @RequestMapping("/simpleParam")
  4. public String param(HttpServletRequest request){
  5. String name=request.getParameter("name");
  6. String ageStr=request.getParameter("age");
  7. int age=Integer.parseInt(ageStr);
  8. System.out.println(name+"---"+age);
  9. return "ok";
  10. }
  11. }

postman:

2fd2c4eb213f46d0921ce382e1904b3c.png

10.2 获取实体参数

原始程序获取参数:

  1. @RestController
  2. public class simpleParam {
  3. @RequestMapping("/simpleParam")
  4. public String param(HttpServletRequest request){
  5. String name=request.getParameter("name");
  6. String ageStr=request.getParameter("age");
  7. int age=Integer.parseInt(ageStr);
  8. System.out.println(name+"---"+age);
  9. return "ok";
  10. }
  11. }

3f6a73d703f34c809742109d6dc46e0e.png

基于springboot方法:

  1. @RestController
  2. public class simpleParam {
  3. @RequestMapping("/simpleParam")
  4. public String param(String name,Integer age){
  5. System.out.println(name+"---"+age);
  6. return "ok";
  7. }
  8. }
  1. @RequestMapping("/simpleParam")
  2. // 方法形参与请求参数名不一致,可以用@RequestParam映射
  3. public String param(@RequestParam(name="name")String username, Integer age){
  4. System.out.println(username+"---"+age);
  5. return "ok";

Dog.java

  1. public class Dog {
  2. private String name;
  3. private String age;
  4. // ptg生成
  5. xx
  6. }

User.java

  1. public class user {
  2. private String name;
  3. private Integer age;
  4. private Dog do1;
  5. ptg
  6. }
simpleParam
  1. @RequestMapping("/simplepolo")
  2. public String param(user u){
  3. System.out.println(u);
  4. return "ook";
  5. }

 96a058f4b4d84801b2a25aec760dd552.png

10.3 数组集合参数

  1. @RequestMapping("/arrayParam")
  2. public String param(String[] arr){
  3. System.out.println(Arrays.toString(arr));
  4. return "ook";
  5. }

f9b27c26f6c949b78e73f2fd1e2bc724.png

e6971ee337144584b3115bfe6dbc28dc.png

集合参数 

  1. @RequestMapping("/listParam")
  2. public String param(@RequestParam List<String> arr){
  3. System.out.println(arr);
  4. return "ook";
  5. }

10.4 日期参数

  1. @RequestMapping("/dataParam")
  2. // pattern与value必须一致,ldt必须与名字保持一致
  3. public String param(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime ldt){
  4. System.out.println(ldt);
  5. return "ook";
  6. }

4c828b94b99e4ad8b5b0a57ef315da38.png

10.5 json参数

  1. @RequestMapping("/jsonParam")
  2. public String param(@RequestBody user u){
  3. System.out.println(u);
  4. return "ook";
  5. }

14e451e03eb6482daf14dc8c7ae2341e.png

c3829b7c1178442b985abc9798d6b27e.png

10.6 路径参数

  1. @RequestMapping("/path/{id}/{name}")
  2. public String param(@PathVariable Integer id,@PathVariable String name){
  3. System.out.println(id+name);
  4. return "ook";
  5. }

5d570e312c364cb8bb58bf83221523aa.png

10.7响应HttpServletResponse

@RestController = @Controller + @ResponseBody
@ResponseBody:将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转换为JSON格式响应
统一响应结果:用一个类节省返回值的编写
  1. /**
  2. * 统一响应结果封装类
  3. */
  4. public class Result {
  5. private Integer code ;//1 成功 , 0 失败
  6. private String msg; //提示信息
  7. private Object data; //数据 data
  8. public Result() {
  9. }
  10. public Result(Integer code, String msg, Object data) {
  11. this.code = code;
  12. this.msg = msg;
  13. this.data = data;
  14. }
  15. public Integer getCode() {
  16. return code;
  17. }
  18. public void setCode(Integer code) {
  19. this.code = code;
  20. }
  21. public String getMsg() {
  22. return msg;
  23. }
  24. public void setMsg(String msg) {
  25. this.msg = msg;
  26. }
  27. public Object getData() {
  28. return data;
  29. }
  30. public void setData(Object data) {
  31. this.data = data;
  32. }
  33. public static Result success(Object data){
  34. return new Result(1, "success", data);
  35. }
  36. public static Result success(){
  37. return new Result(1, "success", null);
  38. }
  39. public static Result error(String msg){
  40. return new Result(0, msg, null);
  41. }
  42. @Override
  43. public String toString() {
  44. return "Result{" +
  45. "code=" + code +
  46. ", msg='" + msg + '\'' +
  47. ", data=" + data +
  48. '}';
  49. }
  50. }

应用:

  1. @RequestMapping("/path/{id}/{name}")
  2. public Result param(@PathVariable Integer id, @PathVariable String name){
  3. System.out.println(id+name);
  4. return Result.success("ook");
  5. }

 7a8619c35b9c45eea3d0f36557d3ce39.png

10.8 案例

获取员工数据,返回统一响应结果,在页面渲染展示

3ed006c6ec1f4cfcbee00f8e8949b0f3.png

引入数据:

EmpController
  1. @RestController
  2. public class EmpController {
  3. @RequestMapping("/listEmp")
  4. //@RequestBody处理将返回对象变为json
  5. public Result list(){
  6. // 1.加载并解析emp.xml
  7. //拿到文件路径
  8. String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
  9. // 解析的file文件,往emp对象封装,解析出list集合
  10. List<Emp> emplist= XmlParserUtils.parse(file, Emp.class);
  11. // 2.对数据进行转换处理
  12. //基于stream流遍历
  13. emplist.stream().forEach(emp->{
  14. String gender=emp.getGender();
  15. if("1".equals(gender))
  16. {
  17. emp.setGender("男");
  18. }else if("2".equals(gender)){
  19. emp.setGender("女");
  20. }
  21. }
  22. );
  23. return Result.success(emplist);
  24. }
  25. }

bfa4776a422c4d0295b6efccc4420d47.png

优化:分层解耦 

6a952b9550b94171b36de3210101e247.png

controller层:获取(调用service层)、返回数据

  1. @RestController
  2. public class EmpController {
  3. //高耦合
  4. // private EmpService empService=new EmpServiceA();
  5. @Autowired
  6. private EmpService empService;
  7. @RequestMapping("/listEmp")
  8. //@RequestBody处理将返回对象变为json
  9. public Result list(){
  10. List<Emp> emplist=empService.listEmp();
  11. return Result.success(emplist);
  12. }
  13. }

service层:业务逻辑处理:将gender的1变为男,2变为女

EmpService.interface

  1. public interface EmpService {
  2. // 获取员工列表
  3. public List<Emp> listEmp();
  4. }
EmpServiceA.java
  1. //@Component表示交给IOC容器管理,称为IOC容器的bean
  2. @Component
  3. public class EmpServiceA implements EmpService {
  4. //高耦合
  5. // private EmpDao empDao=new EmpDaoA();
  6. //依赖注入,IOC容器会提供该类型bean对象,并赋值给该变量
  7. @Autowired
  8. private EmpDao empDao;
  9. List<Emp> emplist=empDao.listemp();
  10. @Override
  11. public List<Emp> listEmp() {
  12. // 2.对数据进行转换处理
  13. //基于stream流遍历
  14. emplist.stream().forEach(emp->{
  15. String gender=emp.getGender();
  16. if("1".equals(gender))
  17. {
  18. emp.setGender("男");
  19. }else if("2".equals(gender)){
  20. emp.setGender("女");
  21. }
  22. }
  23. );
  24. return emplist;
  25. }
  26. }

Dao层:加载并解析emp.xml

EmpDao
  1. public interface EmpDao {
  2. // 获取员工列表
  3. public List<Emp> listemp();
  4. }
EmpDaoA
  1. //@Component表示交给IOC容器管理,称为IOC容器的bean
  2. @Component
  3. public class EmpDaoA implements EmpDao {
  4. @Override
  5. public List<Emp> listemp() {
  6. //1.加载并解析emp.xml
  7. //拿到文件路径
  8. String file=this.getClass().getClassLoader().getResource("emp.xml").getFile();
  9. // 解析的file文件,往emp对象封装,解析出list集合
  10. List<Emp> emplist= XmlParserUtils.parse(file, Emp.class);
  11. return emplist;
  12. }
  13. }

11 分层解耦 

controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。

service:业务逻辑层,处理具体的业务逻辑。

dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查

dao接口:dao层处理的数据有很多,为了灵活切换各种实现

高内聚:service层仅存放与员工有关的业务逻辑处理

低耦合:降低层与层的关联

使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller

@ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。

如果dao包不和controller在同一个文件夹,那么在启动页可以用:@ComponentScan("dao","所在包名")

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/261987
推荐阅读
相关标签
  

闽ICP备14008679号