JavaEE分层模型
- Domain Object(领域对象)层,此层由一系列的POJO(Plain Old JavaObject,普通的、传统的Java对象)组成,这些对象是该系统的Domain Object ,往往包含了各自所需要实现的业务逻辑方法。
- DAO(数据访问对象),此层由一系列的DAO组件组成,这些DAO实现了数据库的创建,查询,更新,删除等原子操作。
- 业务逻辑层:此层由一系列的业务逻辑对象组成,这些业务逻辑对象实现了系统所需要的业务逻辑方法,这些业务逻辑方法可能仅仅用于暴露Domain Object 对象所实现的业务逻辑方法,也可能是依赖DAO组件实现的业务逻辑方法。
- 控制层:此层由一系列的控制器组成,这些控制器用于拦截用户请求,并调用业务逻辑组件的业务逻辑方法,处理用户请求,并根据处理结果转发到不同的表现层组件。
- 表现层:此层由系列的JSP页面、Velocity页面、PDF文档视图组件组成,负责收集用户请求,并将显示处理结果。
JavaEE应用组件
- 表现层组件:主要负责收集用户输入数据,或者向客户显示系统状态。最常用的表现层的技术是JSP,也可以是Velocity、FreeMarker、Tapestry技术。
- 控制器组件:对于JavaEE的MVC框架而言,框架提供了一个前端核心控制器,而核心控制器负责拦截用户请求,并将请求转发给用户实现的控制器组件。而这些用户实现的控制器则负责处理调用业务逻辑方法,处理用户请求。
- 业务逻辑组件:是系统的核心组件,实现系统的业务逻辑。通常,一个业务逻辑方法对应一次用户操作。一个业务逻辑方法应该是一个整体,因此我们1要求对业务逻辑方法增加事务性。业务逻辑方法应该仅仅负责业务逻辑,不应该进行数据库访问。
- DAO组件:数据访问对象,每一个DAO组件都提供了Domain Object对基本对象的创建、更新、查询、删除等操作,这些操作对应于数据库表的增删改查操作。当然,如果采用不同的持久层访问技术,就是使用不同数据库,DAO组件的实现会完全不同,为了实现业务逻辑组件的实现与DAO组件的实现分离,我们为每一个DAO组件都提供接口,业务逻辑组件面向DAO接口编程。
- 领域对象组件:领域对象抽象了系统的对象模型,通常而言,这些领域对象状态都必须保存在数据库里,因此,每一个领域对象通常对应一个或多个数据表。
JavaEE应用的优势
我可以使用JSP完成这个系统,为什么我还要使用Structs+Spring+Hibernate技术,难道就是为了听起来高深一点?为什么还要将系统分层?
我们不能仅仅考虑系统的开发过程,还要考虑系统后期维护,拓展,软件系统不是一次性系统,如果软件不具备可拓展性,当企业发生变化,我们怎么处理,所以应用JavaEE企业框架,有利我们处理这些问题。
Tomcat
到Tomcat官网,下载对应的Tomcat的压缩包,不建议使用安装文件,因为这样的话,是不利用调试,没有什么信息可见。
在使用Tomcat,只需要配置Java_Home 指向Jdk安装地址即可。然后每次打开conf下的startup.bat下启动,需要注意的是,必须允许Java 通过防火墙,否则会出现错误。
在上面一系列配置完成后,当在浏览器输入这里写链接内容,能打开Tomcat主页,表示成功。
tomcat 控制台
在Tomcat主页右上方由这3个按钮
Server Status 是显示作为服务器主机的信息,等等。
Manager控制台可以部署、监控web应用。 但是进入需要密码。
首先进入webapps/manager/web-inf路径,该路径下存放的是manager应用的配置文件,打开web.xml。在这个里面可以看到4种角色。
知道上面的角色类型,下面就是在某种角色下,注册用户。进入tomcat-users.xml,添加对应的用户名、密码,然后重新启动,即可进入控制台。
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
Tomcat部署方式
- 利用控制台将整个项目的绝对路径部署成web应用。
- 将WAR文件部署成web应用。
- 可以将应用工程直接拷到webapps文件目录下,Tomcat会自动部署。
- 通过自定义web部署文件
下面展示一下第四种是如何部署
在conf\Catalina\localhost下,随便新建一个xml文件,添加下面代码。
<context docBase="d:/test/code/aa" debug="0" privileged="true"></context>
我们知道,在前面访问web应用,通过的是http://localhost:8080/项目名/,但是利用这种部署,这里用xml文件的文件名,代替了项目名,访问路径 http://localhost:8080/dd/
Ant 使用
主要用于大的项目编译。到它的官网上下载。然后在环境变量中配置,这个自己看网上的非常全。
Jsp 的工作原理
Jsp异常处理
Jsp的page指令中,由一个errorpage属性,该属性可以指定Jsp页面发现异常,跳转的页面。Jsp通过这种内置的异常处理方法。
Jsp3个编译指令
<%@ page %> 该指令主要用于当前页面的一些设置
<%@ include %> 用于指定另一个页面
<%@ taglib %> 用于自定义标签
page指令常用属性
Jsp动作指令
<jsp:forward></jsp:forward> <%-- 用于页面转 --%>
<jsp:param></jsp:param> <%-- 用于参数传递 --%>
<jsp:include></jsp:include> <%-- 用于动态引入jsp页面 --%>
<jsp:plugin></jsp:plugin> <%-- --%>
<jsp:useBean></jsp:useBean> <%-- 创建一个JavaBean --%>
<jsp:getProperty></jsp:getProperty> <%-- 设置JavaBean 的属性值--%>
<jsp:setProperty></jsp:setProperty> <%-- 获取JavaBean 的属性值--%>
<jsp:forward page="request.jsp">
<jsp:param name="age" value="12"></jsp:param> 跳转页面,可以携带相应的参数,获取的时候通过request内置对象。
</jsp:forward>
forward 跳转新的页面,地址栏的地址不会改变,会用新的页面来相应,所以跳转时携带参数,是不会掉的。
<jsp:include page="request.jsp"></jsp:include> 需要注意:上面我们讲指令,也可以导入页面,那种是静态导入,这种是动态导入。
静态导入,两个jsp文件编译成1个jsp文件,静态导入包含原来文件的编译指令,而动态只是导入内容,不包含原先的指令。
page Bean实例在本页面有效
session Bean 实例在该会话中有效
request Bean 实例在该请求中有效
application Bean 实例在该请求中有效
Jsp内置对象
这里常用的是九个,这里就不在多少。内置对象的使用,应该在Java代码中,所以在<%=%>或者Java脚本中使用。
我们知道内置对象,是不需要定义就可以直接使用的,这是为啥?我们都知道Jsp编译之后都变成Servlet,我们看编译后的源文件。
上述代码都是在xxxxx\work\Catalina\localhost\项目名\org\apache\jsp
我们发现在编译之后的Servlet,都由这些对象,或是定义成局部变量或是形参,所以才可以使用。
Tip
<% %> 和<%! %>虽然这两个长的差不多,但是功能不同。
<% %> 主要放Java代码,这个是毋庸置疑。在这里面不可以申明方法,但是在这个里面可以调用方法。
<%! %> 这个里面可以申明变量,方法,这里申明的变量是全局变量。
<%show(); %>
<%!
public void show(){
System.out.print('c');
}
获取Servlet实例
ServletContext sc = getServletConfig().getServletContext();
配置web应用下的全局参数
全局参数是配置在Web.xml下的context-param。
<context-param>
<param-name>url</param-name>
<param-value>com.exmple.test</param-value>
</context-param>
全局参数是配置整个项目下,作用范围应该是application,所以获取的时候,应该通过application内