Java Web 开发纵览
Web开发哟,我又回来了!
先说一下开始JavaEE的感想,之前传智的课程在开始Java EE 之前有个热身的从XML加载配置然后用反射启动程序的教程。这里就不由自主的想到了Django 也是如此。加上想起来之前在某处看到的话:Web框架一般都是采取了反射技术,一下就理解更深了。学习编程果然是一个螺旋式探索的过程。像极了生化危机里绕了一大圈开门回到警察局大厅,打开了一条新的通路
在学习Django的时候,Web服务使用的是uWSGI,数据库服务是PymySQL或者PostgreSQL的库,中间的框架自然就是Django,来看看Java Web开发所要用到的技术栈吧:
Web 服务层 | Service 业务层 | DAO 数据层 |
---|---|---|
tomcat+jsp+servelt struts2 SpringMVC |
spring | JDBC DBUtils hibernate |
HTTP协议
在原来的Django开发中,主要集中在业务层面的开发,HTTP协议被淡化,虽然一般教程中也会提到request对象的使用和增加自定义头部信息,但整体很少使用这个技术。但是在Java开发中,就要更深入的使用HTTP协议了。
HTTP协议是约束Web服务器与访问者行为的规定。请求和响应必须成对,先有请求后有响应。默认端口是80。
HTTP1.0版本一次请求创建一个连接,获取一个资源,HTTP1.1版本创建一个连接,可以获取多个资源。
现在的HTTP都是1.1版本,已经没有1.0版本。
HTTP请求
请求方式,HTTP规范里有很多,但实际上日常用到的只有GET和POST
请求头
请求头由key:value构成,有固定的写法:
请求头 | 解释 |
---|---|
Accept | 数据类型,用大类型/小类型[参数]表示,传输文件和请求是不同的,要注意 |
Referer | 浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链 |
Accept-Language | 浏览器通知服务器,能够支持的语言 |
User-Agent | 浏览器和操作系统信息 |
Content-Type | 如果是POST请求,就有这个头,表示请求体内容使用的编码,上传文件时候就需要特别设置 |
Accept-Encoding | 浏览器通知服务器,能接受的数据压缩格式 |
Host | 请求的服务器主机名与端口 |
Content-Length | 请求体的长度 |
Connection | 连接状态,如果是Keep-Alive就是保持连接,close就是已关闭 |
If—Modified—Since | 浏览器通知服务器,本地缓存的最后变更时间,与其他响应头共同控制浏览器页面的缓存 |
Cookie | 与会话有关的技术,用于存放cookie信息 |
标红色的是比较重要的请求头。此外还要注意的是,发送请求和回复请求,以及网络上传输的所有数据比如HTML文件,最终都是以UTF-8格式发送的二进制字节流。所以编码和解码也很重要。
请求体
请求头与请求体之间,有两个换行符 /r/n/r/n 来区分
POST提交的数据 都会放在请求体中。GET请求的参数则会放在请求头中。
HTTP响应
响应与请求成对出现,接受到一个请求,服务器就应该发送一个响应。
响应也分为头部信息和响应体,来看看常见的响应头部信息:
响应头 | 解释 |
---|---|
Location | 指定响应路径,与302一起配合使用完成跳转功能 |
content-type | 文件数据类型,使用大类型/小类型 来标识数据类型,还可以带上字符集参数,很重要 |
Content-Disposition | 通过浏览器以下载方式解析正文,参数可以是attachment;filename=xx.zip之类 |
Set-Cookie | 设置Cookie,服务器向浏览器传输Cookie |
content-encoding | 服务器支持的压缩格式 |
Refresh | 定时刷新,参数格式为 秒数;url=路径。 url可以省略,默认值为当前页 |
Server | 指服务器名称,可以由服务器端自定义 |
Content-Length | 响应正文的长度 |
Last-Modified | 服务器通知浏览器,最后修改时间,与请求头的If—Modified—Since配合可以检测页面更新情况进而做操作 |
响应中还一个很重要的内容就是状态码。
请求和响应的具体键值有很多种设置,只要知道常用的,还有一些核心的内容,其他的在用到的时候可以查询。
通过设置请求头和请求体,就可以实现浏览器和服务器在基础连接和协议方面的沟通,在此基础上可以传输任意的数据,传输的具体数据就是响应体。
Web服务
Web服务的B/S和C/S已经知道了,如今就是要做C/S架构的Web应用了。
首先就是Tomcat的配置,类似于Django前端用于解析request的中间件,就像Django自带测试服务器一样。
看了网上的配置文件,创建的时候选择Java EE 然后Web,实际上这个只影响创建文件的体系,还需要在Run-config的时候加入Tomcat服务,这个网上有很多教程了。
自己在尝试的时候,一开始发现不能自定义路径,其实虚拟路径在Deployment选项卡的下边,滚动一下才能出来。还有就是单独run一个jsp文件不行,而是需要运行服务器才行,将虚拟路径修改成"/"之后,就可以直接访问了。
TOMCAT已经有点Web框架的意思,默认去访问ROOT目录下的/index.jsp,可以自建其他目录和路径,能够映射到URL的访问上。
TOMCAT配置好之后,剩下就要来开始学习JSP文件的编写了。JSP看了内容,应该就是JAVA的动态页面文件了。
Tomcat 和Servlet现在基本会用了,在学习响应和请求对象的路上,最近反复配置了几次Intellij 的Tomcat,记录一下如下的几个步骤:
- Run-Configuration 中,点击左上角+,添加一个Tomcat服务器,如果Tomcat配置正确或者下载的zip包,直接选中目录即可,会自动添加所需的内容,关键是下一步,就是Deployment,必须添加一个Artifact,然后选择文件输出目录,一般就是out/artifacts/项目名_war_exploded,这个也是工程发布的目录,之后可以实验一下,启动Tomcat,src中的内容就会自动的发布到这个目录下边
- ServletContext对象,用的时候就现取,因为先执行的是init方法,将servlet对象设置在启动web应用的时候就先创建的话,如果指定了一个非静态变量,会出现无法实例化的情况,所以还是用到的时候再获取,或者采取在类中先声明,在init方法中赋值,才不会出错。
目前Response对象学习完了,会设置响应头的编码或者下载文件了,很有意思,比Python 的框架要更底层一些,但是能控制的内容也更多,不过Servlet核心的Listener和Filter还没有学到,2月顺利的话应该能把Servlet和JSP这片内容过一遍。