目录
第1部分 开发环境安装和配置
01.Java EE应用概述
Java技术的3个版本
- JavaME:Jave Micro Edition,Java技术微型版,为小型设备、独立设备、互联移动设备、嵌入式设备程序开发而设计。
- JavaSE:Java Standard Edition,Java 技术标准版,以界面程序、Java小程序和其它一些典型的应用为目标。
- JavaEE:Java Enterprise Edition,Java技术企业版,以服务器端程序和企业软件的开发为目标。
Java EE应用分层
- Domain Object(领域对象、持久化)层:此层由系列的POJO(Plain Old Java Object,普通的、传统Java对象)组成,这些对象是该系统的Domain Object。
- DAO(Data Access Object数据访问对象)层:此层由系列的DAO组件组成,这些DAO实现了对数据库的增加、查询、更新和删除(CRUD)等原子操作。
- 业务逻辑层:此层由系列的业务逻辑对象组成,这些业务逻辑对象的实现了系统所需要的业务逻辑方法。
- 控制器层:此层由系列控制器组成,这些控制器用于拦截用户请求,并调用业务逻辑组件的业务逻辑方法,处理用户请求。
- 表现层:此层由系列的JSP页面、Velocity页面、PDF文档视图组件组成。此层负责收集用户请求,并将显示处理结果。
Java EE应用的优势
- 更稳定
- 更好的平台适应性
- 更好的扩展性,维护性
常见Java EE服务器
- Web服务器:
- Tomcat: Tomcat 和Java结合的最好,是Sun官方推荐的JSP服务器。
- Jetty: Jetty是另一个优秀的Web服务器。Jetty有个更大的优点,Jetty可作为一个嵌入式服务器,即:如果在应用中加入Jetty的jar文件,应用可在代码中对外提供Web服务。
- Resin: 是目前最快的JSP、Servlet运行平台,支持EJB。个人学习该服务器是免费的,但如果想将该服务器作为商业使用,则需要交纳相应的费用。
- Java EE应用服务器:
- Jboss: 开源的Java EE服务器,目前支持EJB3.0技术
- Weblogic和Websphere: 这两个是专业的商用Java EE服务器,价格不菲。但在性能等各方面也是相当出色。
常用的框架
- MyBatis: 是一个面向Java环境的对象/关系映射工具(ORM)
- Spring: 为企业应用的开发提供了一个轻量级的解决方案,主要有依赖注入、基于AOP的声明式事务管理等功能。
JavaEE的主流技术有:JSP、Servlet和JavaBean,Spring,MyBatis,SpringMVC
02.安装Tomcat
tomcat的默认端口是 8080 ,修改端口需要修改 conf 目录下的 server.xml文件,修改port属性值即可。
第2部分 Jsp&Servlet
01.JDBC
主要接口(都在java.sql包下面):
- java.sql.DriverManager:处理驱动程序的调入和管理
- java.sql.Connection:负责连接数据库
- java.sql.Statement:负责执行数据库SQL语句
- java.sql.ResultSet:负责存放查询结果
- java.sql.PreparedStament:Statement的子接口,负责执行带有参数(?号))库的数据库SQL语句,常用的方法查询executeQuery()和增删改executeUpdate()
常见的数据库的驱动程序名称和url如下(这里我只列举了MsSQL的)
JDBC操作
使用PreparedStatement
PreparedStatement 是 Statement 的子接口,功能与 Statement 类似
- 它在 sql 语句中使用了?代替了需要插入的参数
- 用 PreperedStatement 的 setString(n,参数)或setInt(n,参数)等方法可以将第 n 个?用传进的参数代替。注意变量从1开始编号,这样做增加了程序的可维护性,也增加了程序的安全性
JDBC的事务管理 - Connection类的3个控制事务的方法:
- setAutoCommit(boolean autoCommit):
- commit():
- rollback():
- JDBC API中默认:每条更新语句是一项事务,是自动提交事务
02.Web应用和JSP
JSP是Java Server Page的缩写
(1)JSP是Servlet的一种特殊形式 ,每个JSP页面就是一个Servlet实例(默认情况下只实例化一次) 。JSP 页面由web服务器编译成对应的Servlet。
(2)JSP文件必须在JSP服务器内运行。
- B/S结构和C/S结构
- B/S结构:请求/响应架构
- C/S结构:客户端/服务器架构
- 区别:
1.收集用户输入数据的方式不一样
2.状态是不连续的。请求/响应的架构只有当客户端发出请求时,服务器才可生成响应,服务器无法主动更新客户端状态
3.生成显示时,服务器只能生成HTML标签,有浏览器根据HTML标签显示
Java Web应用的文件结构,必须要有个WEB-INF目录,下面有classes子目录(存放java编译后的class文件)、lib子目录(存放一些数据库驱动、第三方框架等jar文件)、web.xml(web最重要的配置文件,主要配置 servlet、filter、listener和首页等)。
注:web.xml
负责管理如下内容
1.配置JSP
2.配置和管理Servlet
3.配置和管理Listener
4.配置和管理Filter
5.配置标签库
6.配置JSP属性
03.JSP基本语法
-
JSP注释
<%-- 注释内容 --%> :客户端看不到
<!-- 注释内容 -->:客户端可以看到 -
JSP声明
用于声明变量和方法
语法:<%! 声明部分 %>
如<%! private int i=10; %>
定义的变量会转换成Servlet的成员变量
注:
-
输出表达式
语法:<%= 表达式 %>
会在页面上输出表达式的值,功能等同于<% out.print(表达式); %>
如<%= a %>
注意不能加分号 -
脚本(程序段)
最常用,功能较强大
语法:<% 脚本代码部分 %>
如:
<%
for(int i=0;i<10;i++){
;
}
%>
注
04.JSP的三个编译指令
JSP的编译指令是在把JSP 编译成servlet的时候需要用到编译指令都有默认值,因此无须为每个指令设置值
- 常见的编译指令有三个:
- page: 该指令是针对当前页面的指令
- include: 用于指定如何包含另一个页面
- taglib: 用于定义和访问自定义标签
编译指令的语法
<%@ 编译指令名 属性名="属性值" ······ %>
注意@和%号不能有空格
- page指令
- page指令,通常位于JSP页面的顶端
- 同一个页面可以有多个page指令
- page指令的语法格式如下
<%@ page
[import="package.*,······"] 可以用逗号隔开各api
[contentType="text/html;charSet=utf-8"]
[pageEncoding="utf-8"]
......
%>
其中,常用的属性如下:
import: 用于导包(API)的 可以用逗号隔开各api
contentType: 用于设定生成网页的文件格式和编码方式,默认的字符集为ISO-8859-1,一般需要改成utf-8
pageEncoding: 设置jsp页面存储的编码,默认的字符集为ISO-8859-1,一般需要改成utf-8
- include指令
使用include指令,可以将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句(如果有的话)
- 这是个静态的include语句,其特征如下:
- 会导入目标页面的编译指令。
- 目标页面的代码会完全融入本页面。
include编译指令的语法格式如下:
<%@ include file="relativeURLSpec" %>
如
<%@ include file="head.jsp" %>
注:如果两个页面的编译指令不一样,就会出错
(关于这句话,我的理解是当包括的那个页面和原有的页面编译指令产生冲突,才会出错,而不是编译指令不一样就会出错)
- tablib指令
tablib指令是用于定义和访问自定义标签的
- 使用标签库分成以下两步
- 导入标签库:使用taglib编译指令导入标签
- 使用标签:在JSP页面中使用自定义标签
taglib指令的语法格式如下:
<%@ taglib uri="tagliburi" prefix="tagPrefix" %>
prefix就是标签前缀
如
<%@ taglib uri="/struts-tags" prefix="s" %>
使用标签的语法格式如下:
<tagPrefix:tagName
tagAttribute="tagValue"...>
<tagBody>
</tagPrefix>
如果该标签没有标签体,则可以使用如下语法格式:
<tagPrefix:tagName
tagAttribute="tagValue".../>
05.JSP的7个动作指令
-
动作指令与编译指令不同,编译指令是通知Servlet引擎的处理消息,而动作指令只是运行时的脚本动作
-
编译指令在将JSP编译成Servlet时起作用;处理指令通常可替换成Java脚本,是JSP脚本的标准化写法。
语法:<jsp:动作名 属性 1="属性值 1" 属性 n="属性值 n" />
或者<jsp:动作名> 相关内容 </jsp:动作名>
7个动作指令
- jsp:forward: 执行页面转向,将请求的处理转发到下一个页面
- jsp:param: 用于传递参数,必须与其他支持参数的标签一起使用
- jsp:include: 用于动态引入一个JSP页面
- jsp:plugin: 用于下载JavaBean或Applet到客户端执行
- jsp:useBean: 创建JavaBean的实例
- jsp:setProperty: 修改javaBean实例的属性值
- jsp:getProperty: 获取并输出JavaBean实例的属性值
(1)jsp:forward
语法
<jsp:forward page
=“{relativeURL|<%=expression%>}”
{<jsp:param …/>}
</jsp:forward>
如:
<jsp:forward page=“forward-result.jsp”>
<jsp:param name=“age” value=“29”/>
</jsp:forward>
- forward指令用于将页面响应控制转发给另外的页面
- forward指令只能是一次请求有效
- forward指令即可以转发给静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet
forward请求转发的特征:
1.依然是一次请求;
2.目标页面依然可访问请求参数;
3.地址栏里请求的URL没变
(2)jsp:include
语法
<jsp:include
page=“{relativeURL|<%=expression%>}”
fluse=“true”/>
或者
<jsp:include
page=“{relativeURL|<%=expression%>}”
fluse=“true”>
<jsp:param name=“parameterName”
value=“patameterValue”/>
</jsp:include>
flush属性用于指定输出缓存是否转移到被导入文件中。
- include指令是一个动态的include指令,是将目标页面的body部分的内容引入进来,插入到自己的页面中
- include指令不会导入被include页面的其他编译指令(可对比一下静态编译指令include)
(3)jsp:useBean
语法
<jsp:useBean id= "name" class= "包名.类名" scope="request|session"/>
如:
<jsp:useBean id= "fund" class="edu.fzu.openfund.service.FundServiceImpl " scope="request|session"/>
其中
id 属性是JavaBean的实例名,
class 属性确定JavaBean的实现类。
scope 属性用于确定JavaBean 实例的生存范围,该范围主要有以下。
request:该JavaBean实例在本次请求有效。
session:该JavaBean实例在本次session内有效,即本次会话有效。
page:该JavaBean实例仅在该页面有效
application:该JavaBean实例在本应用内一直有效,一个web应用里面只能有一个application对象
(4)jsp:setProperty
语法
<jsp:setProperty name=“BeanName”
property=“propertyName” value=“value” />
其中name属性确定需要设定JavaBean的实例名;
property属性确定需要设置的属性名;
value属性则确定需要设置的属性值。
(5)jsp:getProperty
语法
<jsp:getProperty name=“BeanName”
property=“propertyName” />
其中name属性确定需要输出的JavaBean的实例名;
property属性确定需要输出的属性名。
(6)jsp:plugin
语法:略
注:客户端必须安装虚拟机
(7)jsp:param
语法
<jsp:param name=“paramName” value=“paramValue” />
- param指令用于设置参数值,这个指令本身不能单独使用,因为单独的param指令没有实际意义
- param指令可以与以下三个指令结合使用:
- jsp:include
- jsp:forward
- jsp:plugin
- 当与include指令结合使用时,param指令用于将参数值传入被导入的页面;当与forward指令结合使用时,param指令用于将参数值传入被转向的页面;当与plugin指令结合使用时,则用于将参数传入页面中的JavaBean实例或Applet实例。
06.JSP的9个内置对象
- JSP页面中包含9个内置对象,这9个内置对象都是Servlet API的类或者接口的实例,只是JSP规范将它们完成了默认初始化,即它们已经是对象,可以直接使用
- 在JSP脚本和JSP输出表达式中可以用内置对象
- 在JSP声明部分不能用内置对象
- application对象
对应的类型是javax.servlet.ServletContext的实例,表示Web应用本身,可以用于存储整个web应用范围内有效的对象(属性)
操作application范围内的属性,对应的方法是:
setAttribute(String attName, Object attValue):将一个值放入某个属性,该属性的值对整个Web应用有效;
getAttribute(String attName):在Web应用的每个JSP页面或Servlet都可以访问该属性。
获取Web应用所在服务器上的物理路径,对应的方法是:
getRealPath():获取Web应用在服务器上的物理路径
获取Web应用的配置参数,对应的方法是:
getInitParameter(String paramName):获取Web应用的配置参数。
application使用context-param元素配置参数,其中子元素param-name配置参数名, param-value配置参数值。
注释:通过第三种方式,可以将一些配置信息放在web.xml文件中配置,避免使用硬编码方式写在代码中,从而更好地提高程序解耦
-
config对象
config: javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。
常用的方法有getInitParameter(String paramName)及getInitParameterNames()等方法。
事实上,JSP页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet中有效。 -
exception对象
exception对象是java.lang.Throwable的实例,该实例代表其页面中的异常和错误。
只有当页面是错误处理页面,即page编译指令的isErrorPage属性为true时,该对象才可以使用。
常用的方法有getMessage()和printStackTrace()等。 -
out对象
javax.servlet.jsp.JspWriter的实例,代表JSP页面的输出流,用于输出内容,形成HTML页面
主要方法是:
out.println(“表达式”);
所有使用out的地方,都可以使用输出表达式 <%= “表达式” %>代替,而且使用输出表达式更加简洁 -
page对象
page对象代表该页面本身,通常没有太大用处。也就是Servlet中的this,用于代表该Servlet实例本身
其类型就是生成的Servlet类 -
pageContext对象
pageContext对象是javax.servlet.jsp.PageContext的实例,该对象代表该JSP页面上下文,使用该对象可以访问页面中的共享数据。
常用的方法有setServletContext()和getServletConfig()、setAttribute()、getAttribute(String name,int scope)等。
注:使用pageContext可以直接访问request,session,application范围的属性
- request对象
request对象是javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。
这是一个常用的对象,获取客户端请求参数必须使用该对象。
常用的方法有
request对象的作用
- 取得请求参数的值
- 操作request范围的属性
- 执行include指令或forward指令
- response对象
response对象是javax.servlet.HttpServletResponse的实例,代表服务器对客户端的响应。
它的三个常用作用:- 生成二进制响应。
- 执行重定向。
- 添加Cookie。
主要方法是
sendRedirect(String path);//重定向到某个页面
- session对象
session对象是javax.servlet.http.HttpSession的实例,该对象代表一次会话。一次用户会话的含义是:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开为止,这个过程就是一次会话。
session是把客户状态信息放在服务器端
07.Servlet介绍
1.Servlet开发的要求:
- 在控制层编写Java类,这个类必须继承HttpServlet
- 必须重写doGet和doPost方法来响应客户端的所有请求
- 需要在web.xml中配置servlet
- 如果有一些资源需要在Servlet启动的时候初始化,或关闭时销毁资源,必须重写init()和destroy()方法
- 不要为Servlet提供构造器
注意:如果重写了init(ServletConfig config)方法,则应在重写该方法的第一行调用
super.init(config)。该方法将调用HttpServlet的init方法。
2.Servlet开发步骤
- 编写Servlet类
- 在web.xml中配置servlet
3.Servlet的生命周期
两个选择:1. 客户端请求对应的Servlet时,创建Servlet实例
2. Web应用启动时,立即创建Servlet实例:即load-on-startup Servlet
Servlet 是服务器端的应用程序,默认只实例化一次,采用多线程的方式处理所有请求。
生命周期里的三个方法如下:
init方法:用于初始化。
destroy方法:用于释放资源。
service方法:对用户的请求进行处理,根据不同的请求方式调用 doGet或doPost
过程如下:
当客户端向Web服务器提出第一次Servlet请求时,Web服务器会实例化一个Servlet,并且调用init()方法;如果Web服务器中已经存在了一个Servlet 实例,将直接使用此实例;然后调用service() 方法,service()方法将根据客户端的请求方式来决定调用对应的 doGet()或doPost方法;当Servlet从Web服务器中消亡时,Web服务器将会调用Servlet的destroy()方法。
08.使用Filter和Listener
Filter过滤器:特殊的Servlet,过滤器可以对用户的请求信息和响应信息进行过滤,以指定Servlet过滤器和特定的URL关联。原理图如下:
Filter它可对用户请求进行预处理,可对服务器响应进行后处理
Filter不能对客户端生成响应
创建Filter类的要求
1.必须实现javax.servlet.Filter接口
2.必须实现以下三个方法:
- void init(FilterConfig config):用于完成Filter的初始化。
- void destroy():用于Filter销毁前,完成某些资源的回收。
- void doFilter(ServletRequest request, ServletResponse response, FilterChain chain):实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
<!-- 定义Filter -->
<filter>
<!-- Filter的名字 -->
<filter-name>fiterName</filter-name>
<!-- Filter的实现类 -->
<filter-class>filters.myFilter</filter-class>
</filter>
<!-- 定义Filter拦截地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name> fiterName </filter-name>
<!-- Filter负责拦截的URL -->
<url-pattern>/*</url-pattern>
</filter-mapping>
Listener
使用Listener只需要两个步骤:
(1)定义Listener实现类。
(2)通过Annotation或在web.xml文件中配置Listerner。
要求:
必须实现ServletContextListener接口;
必须实现以下两个方法:
contextInitialized(ServletContextEvent sce):启动Web应用时,系统调用该Listener的方法。
contextDestroyed(ServletContextEvent sce):关闭Web应用时候,系统调用Listener的方法。
配置:
Listener无须配置URL。
若将Listener配置在Web应用中(如果Web容器支持Listener),则Listener将随Web应用的启动而启动。
09.JSP2新特性
表达式语言(EL)
- 语法格式:
- ${expression}
- 即在页面中输出表达式的值
注意:如需要在支持表达式语言的页面中正常输出$符号,则在$符号前加转义字符\,否则系统以为$是表达式语言的标记
EL常用的内置对象有三个:sessionScope、requestScope、param
例从seesion的范围中,输出用户的性别。${sessionScope.user.sex}
相当于<%=((User)session.getAttribute(“user”)).getSex()%>
从request的范围中,输出用户的性别。${requestScope.user.sex}
从请求参数里,输出用户名${param.username}
10.Servlet3新特性
略
11.JavaBean技术
规范
- 必须有一个无参数的构造函数
- 对于Bean中定义的所有属性提供getter和setter方法,并且这些方法是公共的
- 对于Boolean类型的属性,其getter方法的形式为isXxx的,其中Xxx为首字母大写的属性名
特性
- 可以实现代码重复使用
- 容易维护、容易使用且容易编写
- 可以再支持Java的任何平台上使用,而不需要重新编译
- 可以与其他部件整合
JSP使用JavaBean
<jsp:useBean>标签
<jsp:useBean id="login" class="JavaBean.Login"/>
JSP脚本
<% Login login = new Login(); %>
JSP访问JavaBean属性
<jsp:getProperty>标签
<jsp:getProperty name="login" property="userName"/>
JSP脚本
String Password = login.getPassword();
out.print(Password);
输出表达式
<%= login.getPassword() %>
JSP设置JavaBean属性
<jsp:setProperty>标签
<jsp:setProperty name="login" property="userName" value="tsinghua"/>
<jsp:setProperty name="login" property="userName" value="<%=表达式%>"/>
12.MVC设计模式