前言
有了Maven管理项目,要创建一个Java Project已经是非常方便的了,我在github上面托管了几个用codelogger框架(基于Hibernate和Spring MVC)创建的项目demo ,有需要的朋友可以clone下来看一看。
DEMO下载
- 传统Java Web项目,页面是在服务器端生成的,这样处理的好处是方便做seo及权限管理,坏处是加大服务器资源消耗,响应缓慢。
- 基于AngularJs的Java Web项目,服务器只提供REST接口,不负责页面内容的展示,好处是响应快速,富客户端,轻服务器端,但SEO和权限管理相对不太方便。
如果你不知道Git是什么的话,请阅读Git参考手册,以后对项目的管理很多都会用到Git。
将上面的项目clone到本地,用IDE导入Maven项目,然后选择这个项目就可以了,以Eclipse为例:File > Import… > Maven - Existing Maven Projects > Next > Browse.. > 选择项目(根目含pom.xml) > Finishh,然后就可以在IDE里查看源码及进行后续的开发了。
什么是WEB Project
Web Project一共分两种,一个是静态的,一种是动态的。上面两个WEB项目都是Java Dynamic Web project。
动态web project提供后台交互服务,能够根据页面的请求,返回或存储数据,这样用户以后再次访问站点的时候,能得到之前的数据。Java EE动态项目提供servlets,、JSP files、 filters及相关资源,而静态网站则只包含静态的资源,不提供数据的交互服务。静态项目后期可以转为动态项目,动态项目只有在移除掉所有动态特性后才能转为静态项目。
Jave EE项目按照Java Servlet标准,创建好对应的目录及文件,就可以部署到支持servlet的web容器(如tomcat,jetty)中运行,一般情况下都是将整个项目打包为war包进行部署。
Jave Servlet标准
可运行的JaveEE 主文件夹(maven中是src/main/webapp)下面包含:
- META-INF:该文件夹下面包含MANIFEST.MF文件,该文件用于映射项目依赖的class path和jar地址(jar可以放在任意有权限访问的目录,maven的目录默认是用户目录下的.m2文件夹),在打包的时候会根据这些映射,分别将class path放到WEB-INF/classes目录下,依赖的jar放到WEB-INF/lib目录下。
- WEB-INF:该文件夹一般用于放置web项目的配置文件,并且必须包含web.xml,用于配置该web项目的信息。
以及相应的html或jsp文件、css和js,如果不在该目录或其子目录里的文件是不能被访问的。
需要注意的一点就是WEB-INF目录下的资源,程序外部是不能访问的,意思也就是说只能web程序内部访问,通过url(
http://www.codelogger.org/WEB-INF/web.xml
)访问是不行的。
Web项目工作流程
Java Web项目工作流程如下图所示:
- Web Client: 客户端,所以可以发送Http Request请求的客户端,如浏览器,HttpClient程序。
- Web Components: 接收客户端发起的Http Request,在数据处理完成后,返回Http Response到客户端。
- JavaBeans Components: 受Web Components管理的Java程序,在Web Component接收到Web Client请求后,根据其请求,调用相应的JavaBean Component做相应的逻辑与数据操作。
- DateBase:数据库,提供接口,可由Web Components或JavaBeans Component调用,进行数据查询或存储。DateBase只是一个抽象,可以具体到文件系统等,并不仅限于传统的数据库。
需要了解的一点概念
做Web开发,下面一些概念你是需要了解的。
session
session常用语叫做 _会话_,一般用于存储用户信息。
比如你登陆淘宝,你和淘宝之间的一系列交互就是一次session,在这个session中,你登陆一次之后,淘宝就知道你是谁了,不用你重复登陆,因为你所有的交互都是在同一个session内。但是,在长时间不进行任何操作的情况下(或关掉浏览器,重新打开),淘宝会要求你重新登陆,以验证你的身份。
所以,session是有唯一性和时间性的。
当你第一次访问网站的时候,网站会分配给你一个session-id用于确认你是谁,如果这个网站的session时间是10分钟,如果你在10分钟之内都没的和服务器有任何交互的话,这个session就失效了,好比一个陌生人和你打招呼,你在短时间内还能认识他,时长一长,你也就不记得他了是一个效果(只是一个比喻,服务器保存session信息是需要消耗内存空间的,所以一般情况下不会长时持有一个session)。有一点必需要知道的就是,浏览器是不会保存session-id的,也就是说,当你关闭浏览器后,浏览器就已经丢失了你的session-id,所以服务器也就会让你重新登陆。
request
顾名思意,就是请求的问题。
你访问一次网站,刷新页面,都是一次请求。整个过程就是,你通过浏览器地上栏和服务器发请求,服务器接收并处理到你的请求,然后向你返回一个response,你页面上就根据这个response显示数据。
request的生命周期在response返回之后就已经失效了,所以它是一次性的。服务器上forward到一个url操作是在服务器内部跳转并处理同一个request,所以可以通过该request传递数据;而redirect到一个url则是结束当前请求,通过response向客户端发送一个url跳转的信息,让客户端重新请求返回的这个url,所以是两次不同的request,所以不能通过request传递数据。
在同一个request中,servlet可以通过request给其它servlet和jsp传递数据,这个也就是同一个jsp页面,为什么可以显示不同的数据的原因。
使用<jsp:include page=”template/page.jsp”>导入页面,其实是访问服务器的虚拟地址然后插入返回的内容,所以是它会产生另一次request,虽然这个过程是在服务器端完成,但因为是另一个request,所以这个是不能传递数据的,如果想做为模板插入,并要传递数据,请用<%@include file=”template/page.jsp”%> ,它是用的文件系统,直接定位到文件并集成进当前的jsp,所以是在同一个request中,所以就可以传递数据。
cookie
cookie是网站为了辨别用户身份、进行session跟踪而储存在用户本地浏览器上的数据,在你关闭浏览器后重新打开也是有效的,使用场景就是,比如你登陆一个网站,可以勾选“一周之不用重复登陆”或“记住我”这些,都是将用户登陆信息存储在本地的cookie中的,还有就是比如网站的购物车,几个商品分别添加,然后进行比较这些,都是cookie(session maybe)的应用。
cookie在生成时就会被指定一个expire值,这就是cookie的生存周期,在这个周期内cookie有效,超出周期cookie就会被清除。有些页面将cookie的生存周期设置为“0”或负值,这样在关闭浏览器时,就马上清除cookie,不会记录用户信息,更加安全。
请求的分类
详细分类请对看RFC 2616,我主要讲以下两种:
- get:你通过浏览器地址栏直接访问,这个就是get请求,特点是速度比post快,但能传递的数据相对比较小。
- post:通过表单传递数据,比如你在页面上的注册登陆,发表帖子,上传文件等,都属于post类型。其它请求类型如PUT,DELETE,PATCH等,都是基于post而衍生出的子类型,form表单的method只有get和post,所以对于这种类型的请求,都是在post请求的表单里,添加一个
_method:PUT
这种类似的字段,表明执行哪个option。
不管是get还是post,对服务器来说,都是一次request,所以是可以相互传递的,所以对于servlet常用的偷懒方法是这样的:
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
doPost(req, resp);
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// do something here.
}
其实想表达的意思就是,方法是死的,人是活的,要怎样用,自己看着处理就是。
后记
暂时就写到这里,如果朋友们有什么比较常见的疑问,我都会更新上来,所以现在这个页面暂时就这样吧,谢谢你的阅读,希望对你有所帮助。

