Web开发
Web开发者,开发一组web资源,通过Tomcat,传递给浏览器,期间使用HTTP协议。
Web资源–>浏览器,有两种不同的处理方式:
- 后端传递“结构化数据”到浏览器,浏览器上,利用JS把结构化的数据,做有效的展示;(前后端分离,主流)
- 后端直接拼接成浏览器识别的格式(例如html),传递到浏览器即可(出现历史较早,目前仍有使用)
在拼接HTML时,如果在java代码中直接拼接,会让代码和结构过度耦合,引出模板技术
模板第三方库: jsp(基本很少使用)、freemarker、thymeleaf(重点)
具体使用thymeleaf时,代码的执行时机不同:
因为我们对对象/过程的要求不同,所以我们会把代码放到不同的阶段去执行。
-
Web应用启动阶段(会发生仅且仅有一次)∶模板引擎对象,全局有一份就够了
通过Servlet提供的Listener机制:我们做到在ServletContext完成初始化的时候,执行代码,满足我们的要求。 -
访问Web资源字段/处理HTTP请求阶段(会发生无数次): context对象+处理过程。每次处理请求执行一次通过Servlet提供的service机制:我们在service 中的执行代码,就是每次请求一次。
文件上传
如何完成文件上传的操作
1.作为前端(html),通过form表单进行文件提交的,和普通form表单的区别
- 使用form 表单
- form表单enctype必须使用multipart/form-data:< form ectype=“multipart/form-data”>< /form>
- 使用input type=“file” :< input type=“file”>
- form表单的 method必须使用post:< form method=“post”>< /form>
重点:文件上传时,form表单指定为 enctype=multipart/form-data 时,与平时 form表单,HTTP请求的不同!
Content-Type是一种请求头内容是作为请求体
HTTP请求格式:
- 请求行(方法、资源路径、版本)
- 请求头(本次请求的元信息:请求体是什么格式?)
- 请求体(正文)
理论上:发送的HTTP请求的请求体格式出现了区别
请求体携带的信息有:input标签指定的name、上传文件的本地文件名称、上传文件的文件类型、上传文件的内容(只有请求中携带的信息,我们在servlet中才能读到)
作为后端(servlet 中)如何读取这些内容
- Servlet类必须使用@MultipartConfig 的注解修饰。(没有为什么,规定)
- 读取方式略有不同
如何进行文件操作
buffer:缓冲区,一块区域(桶) byte[] buf = new byte[1024];
1024:桶的最大容积
类型是byte类型,输入流、输出流都是以二进制方式进行处理的
InputStream(输入流)
视角:运行着的程序,可以从输入流中读取数据
OutputStream(输出流)
视角:运行着的程序可以向外部输出数据
上述发生了向上转型
如何进行文件的读取
int n = is.read(buf);
用最多能装1024的桶去水龙头上接水
n:实际上接到了多少水,正确:0<= n<= 1024,-1表示水龙头背后的水池被读干净了
1024: 桶最多装多少水
0: 本次没有从水龙头中接到水,但以后还有可能接到水
n: 本次接了多少水
-1: 以后再也不会从水龙头中接到水了
怎么确保用一个桶把水龙头的水全部读干净
byte[] buf = new byte[1024];
while (true) {
int n = is.read(buf);
if (n == -1){ //-1: EOS End Of Stream(水流)
//说明这个水龙头再也不会出水了,就可以退出读取过程break;
}
// TODO:处理buf(桶)的数据(水)
}
对象分类
虽然大家都是对象,但是在代码中所处的角色是不同的!
粗略地分为两种:
- 表示数据的对象
lmage 对象model(模型)
重写toString、equals、hashCode - 表示处理过程的对象(一般单例就够了)lmageListServlet
Database Access Object