一、 Tomcat服务器
l Apache Jakarta的开源项目
l JSP/Servlet容器
l 默认端口:8080
1. 启动和停止
%TOMCAT_HOME%\bin
startup.bat:启动Tomcat的批处理文件
shutdown.bat:停止Tomcat服务并释放资源的批处理文件
1. 启动服务
2. 关闭此窗口就关闭了Tomcat服务
快捷键:ctrl+c
3. 有时,端口会被占用,请记住端口被占用时的异常:
严重: Catalina.stop: java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.<init>(Socket.java:375) at java.net.Socket.<init>(Socket.java:189) at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:422) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:337) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:415) 严重: Error initializing endpoint java.net.BindException: Address already in use: JVM_Bind<null>:8080 at org.apache.tomcat.util.net.JIoEndpoint.init(JIoEndpoint.java:509) at org.apache.coyote.http11.Http11Protocol.init(Http11Protocol.java:176) at org.apache.catalina.connector.Connector.initialize(Connector.java:1058) at org.apache.catalina.core.StandardService.initialize(StandardService.java:677) at org.apache.catalina.core.StandardServer.initialize(StandardServer.java:795) at org.apache.catalina.startup.Catalina.load(Catalina.java:535) at org.apache.catalina.startup.Catalina.load(Catalina.java:555) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:260) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:412) 2012-9-26 9:34:59 org.apache.catalina.startup.Catalina load
|
在%Tomcat_HOME%\logs目录下使用产生日志文件
4. 此时,可以使用shutdown.bat来释放端口
2. 测试Tomcat
在地址栏输入http://localhost:8080或者http://127.0.0.1:8080,如果出现如下界面就表示成功。
3. 配置Tomcat端口号
在%Tomcat_HOME%\conf目录下,使用文本编辑器打开servlet.xml,找到
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> |
将port=”8080”改成你想要的端口就行。
建议:使用大一些的数字,至少1024以后的端口。
4. 部署应用程序
二种方式:
1、 手动部署到webapps
将web应用程序拷贝到Tomcat目录下的webapps下
2、 虚拟目录
在%Tomcat_HOME%\conf目录下,使用文本编辑器打开servlet.xml,在Host标签内配置:
<Context path="/myweb" docBase="H:\2T100\jspservlet\myweb" reloadable="true" /> |
一个Context就代表一个Web应用程序,
path:虚拟路径
docBase:Web程序的物理路径
reloadable:页面改变自动重新加载
二、 Web程序的目录结构
目录 | 说 明 |
/ | Web应用的根目录,该目录下所有文件在 客户端都可以访问,包括JSP、HTML,JPG 等访问资源。 |
/WEB-INF | 存放应用使用的各种资源,该目录及其子 目录对客户端都是不可以访问,其中包括 web.xml(部署表述符) |
/WEB-INF/classes | 存放Web项目的所有的class文件 |
/Web-INF/lib | 存放Web应用使用的JAR文件 |
三、 在Tomcat中管理Web应用程序
点击TomcatManager
输入用户名密码
配置用户和密码
在上图中点击“取消”,出现下图:
然后修改conf/tomcat-users.xml
按上图中的格式添加用户
<user username="tomcat" password="123" roles="admin,manager" /> |
重新进入,输入用户名和密码
进入管理界面:
四、 在Eclipse配置Tomcat
4.1. 配置
选择windwoà首选项
选择MyEclipse
选择Servers
选择Tomcat
使用6.x的版本
l 选择Enable
l 选择Tomcat路径
l Apply(应用)
在Server视图中可以看到新配置的Tomcat项
也可在快捷键中的配置。
选择Confing Server
打开配置窗口
4.2. 部署项目
1、 在快捷菜单中部署
打开部署窗口,选择要部署的Server
点击Add添加项目,Project下拉框会出现所以可以部署的Web项目。
2、 在Servers视图中部署
如果不到Servers视图,打开Servers视图
如果上在面的选项中看不到Servers视图选项,那么可以选择Other,在Other的窗口中选择Servers
可以通过右键菜单也可以通过Servers视图中的快捷工具来部署
4.3. 项目名与部署工程名称
1、 选择项目属性或使用快捷键Alt+回车
2、 选择MyEclipseàweb
web Context-root就是部署后的名称。注意:以”/”开头
五、 JSP (Java Server Pages)
JSP是指:
Ø 在HTML中嵌入Java脚本代码
Ø 由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码
Ø 然后将生成的整个页面信息返回给客户端
六、 JSP工作原理(执行流程)
Web容器处理JSP文件请求需要经过3个阶段:
Ø 翻译阶段(转译阶段)
.jsp à .java
Ø 编译阶段
.java à .class
Ø 执行阶段(运行)
运行.class
注意:第一次请求之后,Web容器可以重用已经编译好的字节码文件。所以,第一次会比较慢。 |
七、 JSP中的元素
Ø 静态内容
HTML内容
Ø 指令
以“<%@ ” 开始,以“%> ” 结束。
比如:<%@ include file = " Filename" %>
Ø 表达式
<%=Java表达式 %>
注意:表达式后不要加分号。
相当于out. print(表达式);
Ø Java脚本 (Java Scriptlet)
<% Java 代码 %>
Ø 声 明
<%! 方法 %>
<%! 变量 %>
Ø 注释
<!-- 这是注释,但客户端可以查看到 --> HTML、XML注释
<%-- 这也是注释,但客户端不能查看到 --%> JSP注释
八、 指令
语法:<%@ 指令名 属性n="属性值n"%> |
常用的指令
Ø <%@ page %>
Ø <%@ include %>
Ø <%@ taglib %>
7.1. page指令
Ø 通过设置内部的多个属性来定义整个页面的属性
Ø 可以使用多次
Ø 一般JSP页面中,第一行就是page指令
Ø page指令常用属性
属性 | 描述 | 默认值 |
language | 指定JSP页面使用的脚本语言 | java也只能是java |
import | 通过该属性来引用脚本语言中使用到的类文件 | 无 |
contentType | JSP所生成的内容类型和编码 | text/html; charset=GBK |
pageEncoding | 用来指定JSP页面所采用的编码方式 | UTF-8或别的编码 |
isELIgnored | 是否忽略EL表达式 | 默认为false |
isErrorPage | 当前JSP是否错误处理页面 | 默认为false 注意:只是为true时,才能JSP中使用 exception内置对象 |
errorPage | 指定错误页面,被指定的JSP页面, isErrorPage一定要为true |
|
7.2. include指令
可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件,从而降低代码的冗余问题,也便于修改共性内容
称为静态包含,它是将file属性文件指定的文件的内容直接包含。
7.3. Java脚本(Scriptlet)
语法 :<% Java代码 %>
写在Java脚本中的代码,事实上,都是在JSP转译成.java后的同一个方法(_jspService())中的代码。
请思考:内置对象从哪来的?
7.4. 声明
语法 :<%! 变量或方法%>
注意:声明中不可以使用内置对象,请说明和记住原因。
九、 九大内置对象
在JSP的脚本中,可以直接使用的对象。
Ø PageContext pageContext ;
Ø HttpSession session ;
Ø ServletContext application;
Ø ServletConfig config ;
Ø JspWriter out ;
Ø Object page;
Ø HttpServletRequest request;
Ø HttpServletResponseresponse
Ø Throwable exception 只有isErrorPage=”true”的页面才拥有
8.1. page
表示当前JSP对象,就是this
8.2. out
是一个输出流,在JSP中用于向客户端输出信息。
8.3. requeset
Ø request对象主要用于处理客户端请求
Ø 或者说代表了客户端一个请求
Ø 当客户端发送一个请求,Web容器就将请求内容封装成一个HttpServletRequest的对象,名叫request的内置对象。
Ø request对象常用方法
方法名称 | 说 明 |
String getParameter(String name) | 根据页面表单组件名称获取页面提交数据 |
String[ ] getParameterValues(String name) | 获取一个页面表单组件对应多个值时的用户的请求数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码,在调用getParameter( )之前进行设定,可以解决中文乱码问题 |
String getRemoterAddr() | 返回提交请求的客户机的IP地址 |
8.4. Eclipse中页面编码的异常消息:
将page指令设置成
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%> |
可以解决。
8.5. response
response对象用于响应客户请求并向客户端输出信息
1、 常用方法
void sendRedirect (String location):将请求重新定位到一个不同的URL,即页面重定向
addCookie():向客户端输出Cookie
getWrite():获得向客户端输出的输出流
setCharacterEncoding():设置响应的编码类型
setContentType():设置响应的内容类型和编码
2、 重定向和转发
response.sendRedirect("main.jsp");//重定向request.getRequestDispatcher("main.jsp").forward(request,response); //转发 |
重定向:
又称为客户端跳转
1、 请求会丢失
2、 地址会改变
转发:
又称为服务端跳转。
1、 请求不会丢失
2、 地址栏不改变
转发是在服务器端发挥作用,通过forward方法将提交信息在多个页面间进行传递。
转发是在服务器内部控制权的转移,客户端浏览器的地址栏不会显示出转向后的地址
重定向是在客户端发挥作用,通过请求新的地址实现页面转向
重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址
关于路径:
重定向:basePath+完整路径
转发:/+完整路径
十、 JSP状态管理(会话跟踪)
10.1. Cookie
Cookie是Web服务器保存在客户端的一系列文本信息。
Cookie的作用
对特定对象的追踪
统计网页浏览次数
简化登录
安全性能
容易信息泄露
常用方法
类型 | 方法名称 | 说 明 |
void | setMaxAge(int expiry) | 设置Cookie的有效期,以秒为单位 大于0 有效时长 等于0 删除Cookie -1和不设置 在浏览器的进程中 |
void | setValue(String value) | 在Cookie创建后,对Cookie进行赋值 |
String | getName() | 获取Cookie的名称 |
String | getValue() | 获取Cookie的值 |
String | getMaxAge() | 获取Cookie的有效时间,以秒为单位 |
//获取客户端发送所有的Cookie <% //获取客户端发送所有的Cookie Cookie[] cookies = request.getCookies();
if (null != cookies) { %> <table width="600" border="1"> <tr> <td> 名称 </td> <td> 值 </td> <td> 有效时长 </td> </tr> <% for (Cookie cookie : cookies) { %> <tr> <td> <%=cookie.getName()%> </td> <td> <%=cookie.getValue()%> </td> <td> <%=cookie.getMaxAge()%> </td> </tr> <% }//创建Cookie Cookie nameCookie = new Cookie("username", "accp"); Cookie pwdCookie = new Cookie("password", "123");
//设置有效时长(秒) nameCookie.setMaxAge(60); pwdCookie.setMaxAge(60);
//向客户端手动写入Cookie response.addCookie(nameCookie); response.addCookie(pwdCookie); |
10.2. session(会话)
会话就是浏览器与服务器之间的一次通话,包含浏览器与服务器之间的多次请求、响应过程 。
类型 | 方法名称 | 说 明 |
void | setAttribute(String key,Object value) | 以key/value的形式保存对象值 |
Object | getAttribute(String key) | 通过key获取对象值 |
int | getMaxInactiveInterval() | 获取session的有效非活动时间,以秒为单位 |
String | getId() | 获取session对象的编号 |
void | invalidate() | 设置session对象失效 |
十一、 JavaBean
符合规范的Java类都是JavaBean
Ø JavaBean的分类
n 封装数据
按照OO原则,属性与数据库表字段相对应
属性私有
public的无参的构造方法
具有public的set/get方法
n 封装业务
具有实现特定功能的方法和方法实现
通常与一个封装数据的JavaBean对应
Ø 优势
n 解决代码重复编写,减少代码冗余
n 功能区分明确,避免业务逻辑处理与页面显示处理集中在一起造成混乱
n 提高了代码的维护性
十二、 四大范围
名称 | 说 明 |
page范围 | 在一个页面范围内有效,通过pageContext对象访问该范围内的对象 |
request范围 | 在一个服务器请求范围内有效,与客户端请求绑定一起 |
session范围 | 在一次会话范围内容有效,在会话期间与session绑定的对象皆属于该范围 |
application范围 | 在一个应用服务器范围内有效,当应用服务启动后即创建该对象,并向所有用户所共享 |
十三、 Tomcat配置连接池
1、 将驱动jar包拷贝到%TOMCAT_HOME%\lib目录下
2、 打开%TOMCAT_HOME%\conf\context.xml文件,在<Context>元素下配置:
<Resource name="jdbc/books" auth="Container"type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="scott" password="tiger" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@192.168.3.80:1521:accp"/> |
3、 在web.xml中配置(可选)
<resource-ref> <res-ref-name> jdbc/ pro</res-ref-name> <res-type> javax.sql.DataSource </res-type> <res-auth> Container </res-auth> </resource-ref>
|
4、 通过JNDI获取数据源,并从数据源得到连接
Context ic = new InitialContext(); DataSource source = (DataSource)ic.lookup("java:comp/env/jdbc/news"); Connection connection = source.getConnection(); |
十四、 Serlvet基础
Servlet 是一个 Java程序,是在服务器上运行以处理客户端请求并做出响应的程序。
必须实现Servlet接口。
13.1. Servlet的生命周期
1、 客户端发出HTTP请求,默认情况下,当第一次请求Servlet时,容器创建Servlet实例。否则进入第3步。
2、 调用Servlet的init()方法进行初始化。
3、 调用Servlet的service()方法处理请求和响应。
4、 然后Servlet常驻内存,等待下一次调用。
5、 应用程序停止,调用Servlet的destroy()释放占用的资源。
注意:在整个应用程序的生命周期中,Servlet的实例只有一个。它以多线程的方式进行服务。
记住JSP与Servlet的生命周期及区别
13.2. Servlet的体系结构
HttpServlet中的doGet()和doPost()由service()方法根据提交请求的方式(GET/POST)来调用。默认为GET
13.3. 常用API
ServeltConfig接口
在Servlet初始化过程中获取配置信息
一个Servlet只有一个ServletConfig对象
ServeltConfig接口的常用方法
方法名称 | 功能描述 |
String getInitParameter(String name) | 获取web.xml中设置的以name命名的初始化参数值 |
ServletContext getServletContext() | 返回Servlet的上下文对象引用 |
ServeltConText接口
获取Servlet上下文
即JSP中的application内置对象
ServeltConText接口的常用方法
方法名称 | 功能描述 |
ServletContext getContext(String path) | 返回服务器上与指定URL相对应的ServletContext对象 |
void setAttribute(String name,Object obj) | 设置Servlet中的共享属性 |
Object getAttribute(String name) | 获取Servlet中设置的共享属性 |
GenericServlet抽象类
提供了Servlet与ServletConfig接口的默认实现方法
HttpServlet继承于GenericServlet
处理HTTP协议的请求和响应
13.4. Servlet的配置
<!-- 注册Servlet --> <servlet> <servlet-name>servlet03</servlet-name> <servlet-class>com.accp.jspservlet.servlet.Servlet03</servlet-class> </servlet>
<!-- 映射 --> <servlet-mapping> <servlet-name>servlet03</servlet-name> <url-pattern>/servlet03</url-pattern> </servlet-mapping> |
13.5. 初始化参数
<servlet> <description>读取初始化参数</description> <servlet-name>InitParamServlet</servlet-name> <servlet-class>com.accp.jspservlet.servlet.InitParamServlet</servlet-class> <!-- 初始化参数,可以配置多个,只有该Servlet能够读取 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </servlet> |
读取:
//获取所有的初始化参数的名称 Enumeration<String> paramNames = config.getInitParameterNames(); while(paramNames.hasMoreElements()){ String paramName = paramNames.nextElement(); String paramValue = config.getInitParameter(paramName); System.out.println(paramName+"="+paramValue); } |
13.6. Servlet上下文参数
<!-- Servlet上下文(ServletContext)参数 --> <context-param> <param-name>hello</param-name> <param-value>world</param-value> </context-param> |
读取:
Enumeration<String> paramNames = context.getInitParameterNames(); System.out.println("Servlet上下文参数,所有的Servlet都可以访问"); while(paramNames.hasMoreElements()){ String paramName = paramNames.nextElement(); String paramValue = context.getInitParameter(paramName); System.out.println(paramName+"="+paramValue); } |
十五、 分层开发
14.1. 为什么需要分层
JSP开发的弊端,业务处理的代码与JSP代码混在一起,不易于阅读,不易于代码维护。
分层模式是最常见的一种架构模式
分层模式是很多架构模式的基础
将解决方案的组件分隔到不同的层中
在同一个层中组件之间保持内聚性
层与层之间保持松耦合
14.2. 三层模式
l 表示层
l 业务逻辑层
l 数据库访问层
层与层的关系
开发原则:
l 上层依赖其下层,依赖关系不跨层
表示层不能直接访问数据访问层
上层调用下层的结果,取决于下层的实现
l 下一层不能调用上一层
l 下一层不依赖上一层
上层的改变不会影响下一层
下层的改变会影响上一层得到的结果
l 在上一层中不能出现下一层的概念
分工明确,各司其职
14.3. MVC
原来我们开发使用JSP+JavaBean的方式,这种我们称为Model 1。
JSP+Servlet+JavaBean的方式,我们称为Model 2。是基于MVC架构的设计模式
MVC就是Model、View、Controller三个单词的缩写。表示模型——视图——控制器。
14.4. Dao模式(Data Access Object)
n 位于业务逻辑和持久化数据之间
n 实现对持久化数据的访问
作用:
l 隔离业务逻辑代码和数据访问代码
l 隔离不同数据库的实现
组成部分:
l DAO接口
l DAO实现类
l 实体类
l 数据库连接和关闭工具类
Ø 只做CURD。
Ø 一个方法对应数据库表的一种操作。
14.5. 业务逻辑层
一个方法对应一个业务。
只封装相关的业务。
事务应该放在业务逻辑层。(请分析为什么?)
14.6. 事务管理
参见DEMO
14.7. commons-fileupload文件上传
参见DEMO
十六、 EL(表达式语言)
Ø JavaBean在JSP中的局限
a) 获取JavaBean属性必须要实例化
b) 强制类型转化
Ø 使用EL表达式简化JSP开发
Ø 语法:
l ${EL exprission }
l ${bean.name } 或 ${ bean['name'] }:要求name属性必须要有getName()
Ø 特点:
l 自动转换类型 EL得到某个数据时可以自动转换类型
对于类型的限制更加宽松.
如果对象为null,自动转换空字符串。
l 使用简单
相比较在JSP中嵌入Java代码,EL应用更简单
Ø 作用域访问对象
属性范围 | EL中的名称 |
page | pageScope,例如${pageScope.username},表示在page范围内查找username变量,找不到返回Null |
request | requstScope |
session | sessionScope |
application | applicationScope |
如果不指定范围,将从小到大的范围一个个查找,找到返回。
Ø param对象
${param.name}
Ø 获取对象集合中的数据
l ${sessionScope.user[1]}得到集合中第二位的对象
Ø 获取对象属性
${user.name}
${user[name]}
Ø 隐式对象
对象名称 | 说 明 |
pageScope | 返回页面范围的变量名,这些名称已映射至相应的值 |
requestScope | 返回请求范围的变量名,这些名称已映射至相应的值 |
sessionScope | 返回会话范围的变量名,这些名称已映射至相应的值 |
applicationScope | 返回应用范围内的变量,并将变量名映射至相应的值 |
param | 返回客户端的请求参数的字符串值 |
paramValues | 返回映射至客户端的请求参数的一组值 |
pageContext | 提供对用户请求和页面信息的访问 |
十七、 JSTL
JSTL实现JSP页面中逻辑处理
JSTL(JavaServerPages Standard TagLibrary)JSP标准标签库
第一:
使用taglib指令引入核心标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |