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,记录一下如下的几个步骤:

  1. Run-Configuration 中,点击左上角+,添加一个Tomcat服务器,如果Tomcat配置正确或者下载的zip包,直接选中目录即可,会自动添加所需的内容,关键是下一步,就是Deployment,必须添加一个Artifact,然后选择文件输出目录,一般就是out/artifacts/项目名_war_exploded,这个也是工程发布的目录,之后可以实验一下,启动Tomcat,src中的内容就会自动的发布到这个目录下边
  2. ServletContext对象,用的时候就现取,因为先执行的是init方法,将servlet对象设置在启动web应用的时候就先创建的话,如果指定了一个非静态变量,会出现无法实例化的情况,所以还是用到的时候再获取,或者采取在类中先声明,在init方法中赋值,才不会出错。

目前Response对象学习完了,会设置响应头的编码或者下载文件了,很有意思,比Python 的框架要更底层一些,但是能控制的内容也更多,不过Servlet核心的Listener和Filter还没有学到,2月顺利的话应该能把Servlet和JSP这片内容过一遍。