老杜 JavaWeb 讲解
Posted 史前蓝熊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了老杜 JavaWeb 讲解相关的知识,希望对你有一定的参考价值。
老杜 JavaWeb 讲解
对应视频:
(四) 实现一个基本的web应用(无Java)
4.1 基本步骤
-
找到CATALINA_HOME\\webapps目录
因为所有的webapp要放到webapps目录下。(没有为什么,这是Tomcat服务器的要求。如果不放到这里,Tomcat服务器找不到你的应用。)
-
在CATALINA_HOME\\webapps目录下新建一个子目录,起名:oa
这个目录名oa就是你这个webapp的名字。
-
在oa目录下新建资源文件,例如:index.html
编写index.html文件的内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>index page</title> </head> <body> <h1>my index page</h1> </body> </html>
-
启动Tomcat服务器
-
打开浏览器,在浏览器地址栏上输入对应的URL
(http://127.0.0.1:8080/oa/index.html)
运行结果:
http://127.0.0.1:8080/oa/index.html
产生疑问:
我们在浏览器上直接输入一个URL,然后回车。这个动作和超链接一样吗?
答案:
一样的,其实在一些支持超链接的软件或页面中,点击http://127.0.0.1:8080/oa/index.html即可直接访问对应的页面。
比如QQ聊天窗口或者Typora等软件。
在页面中,可以通过这种方式实现页面跳转。
4.2 静态资源与动态资源
-
访问http://127.0.0.1:8080/oa/userList.html ,可以展示一个用户列表页面。但是这个用户列表页面是写死在HTML文件当中的。这种资源我们称为静态资源。怎么能变成动态资源。显然需要连接数据库。
userList.html:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>user list page</title> </head> <body> <table border="1px" align="center" > <tr> <th>no</th> <th>username</th> </tr> <tr> <th>1</th> <th>扎古</th> </tr> <tr> <th>2</th> <th>元祖</th> </tr> <tr> <th>3</th> <th>红异端</th> </tr> <tr> <th>4</th> <th>量产机</th> </tr> </table> </body> </html>
页面显示:
-
连接数据库需要JDBC程序,也就是说需要编写Java程序连接数据库,数据库中有多少条记录,页面上就显示多少条记录,这种技术被称为动态网页技术。(动态网页技术并不是说页面中有flash动画。动态网页技术是说页面中的数据是动态的,根据数据库中数据的变化而变化。)
4.3 请求和响应中的角色
一个web应用请求和响应的过程,有什么角色参与其中,他们之间又有多少个协议?
角色:
- 浏览器开发团队开发的浏览器
- WEB Server团队开发的服务器(Tomcat、Jetty、WebLogic、JBOSS、WebSphere....)
- DB Server的开发团队开发的数据库(DB Server这个软件也是太多了:Oracle、MySQL.....)
- webapp的开发团队(WEB应用是我们做为JavaWEB程序员开发的)
协议:
- webapp的开发团队 和 WEB Server的开发团队 之间有一套规范: JavaEE规范之一Servlet规范。
- Servlet规范的作用是什么?
- WEB Server 和 webapp解耦合。
- Servlet规范的作用是什么?
- Browser 和 WebServer之间有一套传输协议:HTTP协议。(超文本传输协议。)
- webapp开发团队 和 DB Server的开发团队之间有一套规范:JDBC规范。
4.4 Servlet是什么规范?
- 遵循Servlet规范的webapp,这个webapp就可以放在不同的WEB服务器中运行。(因为这个webapp是遵循Servlet规范的。)
Servlet规范包括什么呢?
- 规范了哪些接口
- 规范了哪些类
- 规范了一个web应用中应该有哪些配置文件
- 规范了一个web应用中配置文件的名字
- 规范了一个web应用中配置文件存放的路径
- 规范了一个web应用中配置文件的内容
- 规范了一个合法有效的web应用它的目录结构应该是怎样的。
- .....
文理双修:
3.《青玉案 元夕》宋朝·辛弃疾
东风夜放花千树,更吹落,星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。
蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。
译文:
像东风吹散千树繁花一样,又吹得烟火纷纷,乱落如雨。豪华的马车满路芳香。悠扬的凤箫声四处回荡,玉壶般的明月渐渐西斜,一夜鱼龙灯飞舞笑语喧哗。
美人头上都戴着亮丽的饰物,笑语盈盈地随人群走过,身上香气飘洒。我在人群中寻找她千百回,猛然一回头,不经意间却在灯火零落之处发现了她。
跟老杜从零入门MyBatis到架构思维使用MyBatis完成CRUD- insert(Create)
使用MyBatis完成CRUD
配合视频教程观看,更易学习理解,课程讲解从Mybatis的一些核心要点与实战中的运用,一直过渡到MyBaits源码,由表及里的代入架构思维。一步一案例,一码一实操。从简单到深入,从实战到源码,MyBatis重点、难点、考点一网打尽。
●准备工作
○创建module(Maven的普通Java模块):mybatis-002-crud
○pom.xml
■打包方式jar
■依赖:
●mybatis依赖
●mysql驱动依赖
●junit依赖
●logback依赖
○mybatis-config.xml放在类的根路径下
○CarMapper.xml放在类的根路径下
○logback.xml放在类的根路径下
○提供com.powernode.mybatis.utils.SqlSessionUtil工具类
○创建测试用例:com.powernode.mybatis.CarMapperTest
1. insert(Create)
分析以下SQL映射文件中SQL语句存在的问题
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace先随便写-->
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(103, 奔驰E300L, 50.3, 2022-01-01, 燃油车)
</insert>
</mapper>
存在的问题是:SQL语句中的值不应该写死,值应该是用户提供的。之前的JDBC代码是这样写的:
// JDBC中使用 ? 作为占位符。那么MyBatis中会使用什么作为占位符呢?
String sql = "insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(?,?,?,?,?)";
// ......
// 给 ? 传值。那么MyBatis中应该怎么传值呢?
ps.setString(1,"103");
ps.setString(2,"奔驰E300L");
ps.setDouble(3,50.3);
ps.setString(4,"2022-01-01");
ps.setString(5,"燃油车");
在MyBatis中可以这样做:
在Java程序中,将数据放到Map集合中
在sql语句中使用 #map集合的key 来完成传值,# 等同于JDBC中的 ? ,#就是占位符
Java程序这样写:
package com.powernode.mybatis;
import com.powernode.mybatis.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
/**
* 测试MyBatis的CRUD
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class CarMapperTest
@Test
public void testInsertCar()
// 准备数据
Map<String, Object> map = new HashMap<>();
map.put("k1", "103");
map.put("k2", "奔驰E300L");
map.put("k3", 50.3);
map.put("k4", "2020-10-01");
map.put("k5", "燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL语句(使用map集合给sql语句传递数据)
int count = sqlSession.insert("insertCar", map);
System.out.println("插入了几条记录:" + count);
SQL语句这样写:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace先随便写-->
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#k1,#k2,#k3,#k4,#k5)
</insert>
</mapper>
# 的里面必须填写map集合的key,不能随便写。运行测试程序,查看数据库:
如果#里写的是map集合中不存在的key会有什么问题?
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#kk,#k2,#k3,#k4,#k5)
</insert>
</mapper>
运行程序:
通过测试,看到程序并没有报错。正常执行。不过 #kk 的写法导致无法获取到map集合中的数据,最终导致数据库表car_num插入了NULL。
在以上sql语句中,可以看到#k1 #k2 #k3 #k4 #k5的可读性太差,为了增强可读性,我们可以将Java程序做如下修改:
Map<String, Object> map = new HashMap<>();
// 让key的可读性增强
map.put("carNum", "103");
map.put("brand", "奔驰E300L");
map.put("guidePrice", 50.3);
map.put("produceTime", "2020-10-01");
map.put("carType", "燃油车");
SQL语句做如下修改,这样可以增强程序的可读性:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="car">
<insert id="insertCar">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#carNum,#brand,#guidePrice,#produceTime,#carType)
</insert>
</mapper>
运行程序,查看数据库表:
使用Map集合可以传参,那使用pojo(简单普通的java对象)可以完成传参吗?测试一下:
●第一步:定义一个pojo类Car,提供相关属性。
package com.powernode.mybatis.pojo;
/**
* POJOs,简单普通的Java对象。封装数据用的。
* @author 老杜
* @version 1.0
* @since 1.0
*/
public class Car
private Long id;
private String carNum;
private String brand;
private Double guidePrice;
private String produceTime;
private String carType;
@Override
public String toString()
return "Car" +
"id=" + id +
", carNum=" + carNum + \\ +
", brand=" + brand + \\ +
", guidePrice=" + guidePrice +
", produceTime=" + produceTime + \\ +
", carType=" + carType + \\ +
;
public Car()
public Car(Long id, String carNum, String brand, Double guidePrice, String produceTime, String carType)
this.id = id;
this.carNum = carNum;
this.brand = brand;
this.guidePrice = guidePrice;
this.produceTime = produceTime;
this.carType = carType;
public Long getId()
return id;
public void setId(Long id)
this.id = id;
public String getCarNum()
return carNum;
public void setCarNum(String carNum)
this.carNum = carNum;
public String getBrand()
return brand;
public void setBrand(String brand)
this.brand = brand;
public Double getGuidePrice()
return guidePrice;
public void setGuidePrice(Double guidePrice)
this.guidePrice = guidePrice;
public String getProduceTime()
return produceTime;
public void setProduceTime(String produceTime)
this.produceTime = produceTime;
public String getCarType()
return carType;
public void setCarType(String carType)
this.carType = carType;
●第二步:Java程序
@Test
public void testInsertCarByPOJO()
// 创建POJO,封装数据
Car car = new Car();
car.setCarNum("103");
car.setBrand("奔驰C200");
car.setGuidePrice(33.23);
car.setProduceTime("2020-10-11");
car.setCarType("燃油车");
// 获取SqlSession对象
SqlSession sqlSession = SqlSessionUtil.openSession();
// 执行SQL,传数据
int count = sqlSession.insert("insertCarByPOJO", car);
System.out.println("插入了几条记录" + count);
●第三步:SQL语句
<insert id="insertCarByPOJO">
<!--# 里写的是POJO的属性名-->
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#carNum,#brand,#guidePrice,#produceTime,#carType)
</insert>
●运行程序,查看数据库表:
# 里写的是POJO的属性名,如果写成其他的会有问题吗?
<insert id="insertCarByPOJO">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#a,#brand,#guidePrice,#produceTime,#carType)
</insert>
运行程序,出现了以下异常:
错误信息中描述:在Car类中没有找到a属性的getter方法。
修改POJO类Car的代码,只将getCarNum()方法名修改为getA(),其他代码不变,如下:
再运行程序,查看数据库表中数据:
经过测试得出结论:
如果采用map集合传参,# 里写的是map集合的key,如果key不存在不会报错,数据库表中会插入NULL。
如果采用POJO传参,# 里写的是get方法的方法名去掉get之后将剩下的单词首字母变小写(例如:getAge对应的是#age,getUserName对应的是#userName),如果这样的get方法不存在会报错。
注意:其实传参数的时候有一个属性parameterType,这个属性用来指定传参的数据类型,不过这个属性是可以省略的
<insert id="insertCar" parameterType="java.util.Map">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#carNum,#brand,#guidePrice,#produceTime,#carType)
</insert>
<insert id="insertCarByPOJO" parameterType="com.powernode.mybatis.pojo.Car">
insert into t_car(car_num,brand,guide_price,produce_time,car_type) values(#carNum,#brand,#guidePrice,#produceTime,#carType)
</insert>
以上是关于老杜 JavaWeb 讲解的主要内容,如果未能解决你的问题,请参考以下文章
动力节点老杜B站Spring6学习笔记—Spring的入门程序
跟老杜从零入门MyBatis到架构思维使用MyBatis完成CRUD- insert(Create)
好课分享:开课吧数据分析全栈工程师第8期 老杜2020版Java零基础685集(视频采用JDK13录制)