`

jsp总结

    博客分类:
  • JSP
阅读更多

转自平坦软件园
C/S--->client/service97J平坦软件园
优点:97J平坦软件园
1)运行效率较高97J平坦软件园
2)交互性强适合局域网,97J平坦软件园
缺点:升级维护困难97J平坦软件园
B/S-->WEB应用 browser浏览器 Service97J平坦软件园
优点:无需关心客户端,升级维护,只需操作服务器即可.比较方便.97J平坦软件园
缺点:97J平坦软件园
1)交互性是请求/响应式,需要通过网络进行交互,效率相对c/s架构的软件来说较低.97J平坦软件园
2)要开发交互性较强的界面比较困难. 97J平坦软件园

CGI:最早开发b/s架构的一门技术97J平坦软件园
从CGI分出 1)微软的ASP--->ASP.NET97J平坦软件园
2)JAVA的Servlet--->jsp97J平坦软件园

开发技术:97J平坦软件园
静态网页技术:97J平坦软件园
HTML,JS,CSS97J平坦软件园
动态网页技术:(动态说的是数据动态)97J平坦软件园
CGI,ASP,ASP.net,servlet,php,jsp等97J平坦软件园
url:97J平坦软件园
http://192.168.1.250:8888/poll/login.jsp97J平坦软件园
协议://地址(ip-->域名):端口(如果是80,可以省略)/web应用名/资源名97J平坦软件园
web服务器: (微软的)IIS:97J平坦软件园
(apache的)tomcat(开源的):等..97J平坦软件园

servlet:97J平坦软件园
1)属于j2ee的其中一个技术,是一个规范97J平坦软件园
2)servlet是一个web组件(包含servlet类和他的描述信息) 组件如java bean 可复用的97J平坦软件园
3)servlet运行的时候就是一个java对象(创建.调用.管理由web服务器(web容器)完成).web容器是web服务器的线程 tomcat的web容器是CATALINA97J平坦软件园

web 容器调用servlet对象的方法97J平坦软件园
首先由web容器创建两个对象:97J平坦软件园
1.HttpServletRequest:97J平坦软件园
包含了客户端提交的所以信息,在servlet中 ,可以通过这个对象获得客户端传递过来的数据.97J平坦软件园
2.HttpServletResponse:97J平坦软件园
通过这个对象可以向客户端返回数据97J平坦软件园
public void service(ServletRequest req,ServletResponse res){97J平坦软件园

}97J平坦软件园

web应用的目录结构:97J平坦软件园
应用名:(web应用的根目录的名字)97J平坦软件园
WEB-INF(必须):浏览器不能直接访问97J平坦软件园
classes(存放.class文件)97J平坦软件园
lib(存放第三方的.jar文件)97J平坦软件园
web.xml(描述servlet,包括类名和访问标识)97J平坦软件园
html/first.html97J平坦软件园
js/my.js97J平坦软件园
css/my.css97J平坦软件园
jsp/first.jsp97J平坦软件园
META-INF97J平坦软件园
tomcat服务器的目录结构:97J平坦软件园
bin:存放一些可执行文件:比如startup.sh,shutdown.sh97J平坦软件园
common:存放tomcat服务器和所以web应用都可以使用的类和jar包97J平坦软件园
conf:存放tomcat服务器使用的一些配置文件.比如 service.xml中可改端口号97J平坦软件园
logs:存放tomcat服务器和web应用输出的日志信息的文件97J平坦软件园
server:存放一些只能由tomcat服务器使用的类和jar包,以及tomcat自带的web应用97J平坦软件园
shared:存放一些只能由web应用使用的类和jar包97J平坦软件园
temp:存放一些临时文件97J平坦软件园
*webapps:用来部署web应用97J平坦软件园
work:存放jsp文件被翻译和编译以后的.java和.class文件.97J平坦软件园

web工程(IDE):通过工程可创建web应用97J平坦软件园
97J平坦软件园
web应用:(成品软件)97J平坦软件园

javax.servlet.Servlet(接口)97J平坦软件园

javax.servlet.GenericServlet(抽象类)97J平坦软件园

javax.servlet.http.HttpServlet(抽象类)(建议使用)97J平坦软件园
Service-->doGet/doPost(根据客户端请求方式调用,不是非要同时调用)97J平坦软件园

97J平坦软件园
tomcat由于已经启动无法启动 用命令 ps -ef|grep tomcat 在kill -9 进程号97J平坦软件园

97J平坦软件园

form表单处理:97J平坦软件园
1.提供表单97J平坦软件园
a)提供一个html页面包含一个form表单97J平坦软件园
97J平坦软件园
b)提供一个servlet返回一个form表单97J平坦软件园
form表单action属性指定的路径97J平坦软件园
a)相对路径97J平坦软件园
register97J平坦软件园
b)绝对路径97J平坦软件园
/servlet/form/register97J平坦软件园

2.中文乱码问题97J平坦软件园
a)get方式提交97J平坦软件园
解决办法,在服务器中设置客户端提交请求的URI的编码类型 97J平坦软件园
在server.xml中 <Connector 加 URIEncoding="UTF-8"97J平坦软件园
b)post方式提交97J平坦软件园
在server中获得客户端提交的参数之前,调用req对象的setCharacterEncoding方法设定编码类型。97J平坦软件园
c)响应97J平坦软件园
在server中获得输出流之前,调用response对象的的setCharacterEncoding方法设定编码类型。97J平坦软件园
97J平坦软件园
3.method="get"和method="post" (form表单的两种提交方式比较)97J平坦软件园
get请求:97J平坦软件园
a)直接在浏览器地址栏输入请求的URL发起的请求:97J平坦软件园
b)点击一个超连接发起的请求97J平坦软件园
c)提交一个form表单但form表单的method不指定或指定get的时候97J平坦软件园
特点:97J平坦软件园
提交的数据放在请求的头部,一般在查询数据的时候我们会选择get方法发起请求97J平坦软件园
post请求:97J平坦软件园
a)提交一个method属性指定为post的表单发起的请求.97J平坦软件园
特点:97J平坦软件园
提交的数据放在请求体部,在向客户端提交数据的时候我们会选择使用post方式发起请求.97J平坦软件园

4.request/response对象中的方法97J平坦软件园

request.getContextPath();返回web的应用的根路径 97J平坦软件园
request.getMethod();返回请求方式,get或post 97J平坦软件园
request.getParameterMap();获得客户端提交的所有参数,包括参数名字和值 97J平坦软件园
request.getParameterNames();获得客户端参数名字 97J平坦软件园
request.getQueryString();返回URI后面所跟着的参数 如果是post方式提交返回null 97J平坦软件园
request.setCharacterEncoding("UTF-8");设定客户端提交的内容的编码类型 97J平坦软件园

5.servlet的url-pattern的写法(补充)97J平坦软件园
a)以"/"开始,后面跟着具体的内容97J平坦软件园
b)前通配(*) :如 *.do,*.action97J平坦软件园
c)后通配 如: /form/*,/basic/*97J平坦软件园

97J平坦软件园
Servlet的生命周期(四个阶段)97J平坦软件园
1)装载和实例化阶段97J平坦软件园
创建者:web容器97J平坦软件园
创建情况:97J平坦软件园
(1)第一次访问的时候创建97J平坦软件园
<load-on-startup>num</load-on-startup>(num默认为-1)97J平坦软件园
当num<0时,第一次访问时创建servlet实例97J平坦软件园

(2)web应用被安装的时候创建(启动服务器)97J平坦软件园
当num >=0时,servlet在web应用被安装的时候创建97J平坦软件园
创建顺序:97J平坦软件园
num=0,最晚被创建97J平坦软件园
num>0,值越小越早被创建97J平坦软件园
2)初始化阶段97J平坦软件园
调用者:web容器97J平坦软件园
public void init(ServletConfig config){}97J平坦软件园

在GenericServlet中已经对有参的init方法作了实现97J平坦软件园
public abstract class GenericServlet implement Servlet{97J平坦软件园
private ServletConfig config;97J平坦软件园
public void init(ServletConfig config){97J平坦软件园
this.config=config;97J平坦软件园
this.init();97J平坦软件园
}  97J平坦软件园
public void init(){97J平坦软件园
97J平坦软件园
}97J平坦软件园
} 97J平坦软件园
3)服务阶段97J平坦软件园
调用者:web容器97J平坦软件园
public void service(ServletRequest req,ServletResponse res){97J平坦软件园
97J平坦软件园
}97J平坦软件园
在HttpServlet中已经对service方法作了实现97J平坦软件园
public abstract class HttpServlet extends GenericServlet{97J平坦软件园
public void service(ServletRequest req,ServletResponse res){97J平坦软件园
HttpServletRequest hReq=(HttpServletRequest)req;97J平坦软件园
HttpServletResponse hRes=(HttpServletResponse)res;  97J平坦软件园
service(hReq,hRes);97J平坦软件园
}97J平坦软件园
public void service(HttpServletRequest hReq, HttpServletResponse hRes){97J平坦软件园
String method=hReq.getMethod();97J平坦软件园
97J平坦软件园
if(method.equals("GET")){97J平坦软件园
doGet(hReq,hRes);97J平坦软件园
}else if(method.equals("POST")){97J平坦软件园
doPost(hReq,hRes);97J平坦软件园
}97J平坦软件园
}97J平坦软件园
//被子类覆盖97J平坦软件园
public void doGet(HttpServletRequest request, HttpServletResponse response) {97J平坦软件园
97J平坦软件园
}97J平坦软件园
//被子类覆盖97J平坦软件园
public void doPost(HttpServletRequest request, HttpServletResponse response){97J平坦软件园
97J平坦软件园
}97J平坦软件园
}97J平坦软件园
4)销毁阶段97J平坦软件园
调用者:web容器97J平坦软件园
public void destory{97J平坦软件园

}97J平坦软件园

注:init(),service(),destroy()称为servlet对象的生命周期回掉方法.97J平坦软件园

web应用的逻辑分层:97J平坦软件园
model(模型):97J平坦软件园
javabean,ejb..97J平坦软件园
view(显示):97J平坦软件园
servlet,jsp等97J平坦软件园
control(控制):97J平坦软件园
servlet,jsp....97J平坦软件园

请求的转发:97J平坦软件园
1)服务器内部跳转97J平坦软件园
请求转发器:RequestDispather97J平坦软件园
创建:97J平坦软件园
1.调用request对象的方法97J平坦软件园
指定的转发路径可以相对也可以是绝对的97J平坦软件园
相对路径:根据当前servlet的路径和转发的路径进行计算97J平坦软件园
绝对路径:就是转发的servlet的url-pattern97J平坦软件园
2.调用servletContext对象的方法97J平坦软件园
指定的路径必须是绝对路径97J平坦软件园

forward:97J平坦软件园
在转发请求之前首先调用response对象的resetBuffer方法,清空缓存.97J平坦软件园
include(包含):97J平坦软件园
将请求转发到其他servlet之前不会清空缓存97J平坦软件园

2)服务器外部重定向97J平坦软件园
RedirectServlet97J平坦软件园
通过服务器外部重顶向进行请求的转发 里面的路径可以相对可以绝对97J平坦软件园
绝对路径写法: 应用根路径+servlet的url-pattern 97J平坦软件园
例:response.sendRedirect(request.getContextPath()+"/resource/view");97J平坦软件园
相对路径写法:例:response.sendRedirect("view");97J平坦软件园

服务器内部跳转和服务器外部重定向的比较97J平坦软件园
1)服务器内部跳转所有的servlet共享同一个请求,而服务器外部重定向,每个Servlet接受的请求都不相同97J平坦软件园
2)服务器内部跳转是在服务器实现的,而服务器外部重定向是由浏览器实现的97J平坦软件园
3)服务器内部跳转是通过request对象来完成的,而服务器外部重定向是通过response对象来完成的.97J平坦软件园

作业:97J平坦软件园

1.findUser.html97J平坦软件园
2.FindUserServlet:97J平坦软件园
1.负责接收客户端查找用户的请求97J平坦软件园
2.调用UserMange的findUser(String name)97J平坦软件园
3.将找到的User对象交给ViewUserServlet显示97J平坦软件园
ViewUserServlet97J平坦软件园
1.首先判段有没有需要显示的user,如果没有 提示97J平坦软件园
2.如果有,则将用户的详细信息进行显示97J平坦软件园

3.在UserManager中提供查询用户的方法.97J平坦软件园

97J平坦软件园
Context ctx=new InitialContext();97J平坦软件园
DataSource ds=(DataSource)ctx.lookup(jndiName);97J平坦软件园

通过jndi从目录服务器上查找DataSource对象97J平坦软件园
DataSource( 连接池);97J平坦软件园
06 02 2008 JNDI:java name directory interface97J平坦软件园
创建DataSource对象97J平坦软件园
1.通过new 的方式创建.97J平坦软件园

97J平坦软件园
2.通过web服务器提供的配置的方式,来创建DataSource(这种方式创建的DataSource已经存放在目录服务器上).97J平坦软件园
1)将oracle的驱动包放入到tomcat的common/lib目录下97J平坦软件园
2)JNDI Name:jdbc/ds97J平坦软件园
数据库的URL Data Source URL:jdbc:oracle:thin:@192.168.1.220:1521:briupdb97J平坦软件园
数据库驱动名:JDBC Driver Class:oracle.jdbc.driver.OracleDriver97J平坦软件园
数据库用户名:User Name:jd0804 97J平坦软件园
数据库用户密码:Password:jd080497J平坦软件园
最大活动的连接数:Max. Active Connections:97J平坦软件园
Max. Idle Connections:(当连接池没有连接的时候,再创建的连接数)97J平坦软件园

97J平坦软件园
使用DataSource97J平坦软件园
1.如果是通过new的方式创建的DataSource,可以直接调用他的getConnection方法来获得连接97J平坦软件园
2.通过jndi访问目录服务器,查找DataSource,调用方法获得连接.97J平坦软件园

ch05 状态持久。97J平坦软件园
为什么需要状态持久?97J平坦软件园
因为http协议是无状态的,客户端发起一个请求的时候,会跟服务器建立socket连接,一旦响应,就会关闭socket连接,所以为了让服务器端知道某个客户端的状态信息,我们需要将状态进行持久化97J平坦软件园

cookie97J平坦软件园
创建:       name        value97J平坦软件园

Cookie cookie = new Cookie("isLogin", "true");97J平坦软件园
cookie.setMaxAge(time);97J平坦软件园
response.addCookie(cookie);97J平坦软件园
当time<0,表示cookie保存在浏览器进程中,一旦浏览器进程结束,cookie就消失97J平坦软件园
当time=0,表示删除客户端同名的cookie97J平坦软件园
当time>0,表示cookie将在浏览器端保存起来,超过time后才会消失97J平坦软件园

获取:97J平坦软件园
Cookie[] cookies=request.getCookies();97J平坦软件园

97J平坦软件园

session(结合cookie使用):创建和保存都在服务器端97J平坦软件园

由web服务器维护97J平坦软件园
HttpSession session = request.getSession();97J平坦软件园
或者97J平坦软件园
HttpSession session = request.getSession(boolean create);97J平坦软件园
当create==true时,这个方法的作用跟无参的getSession()方法作用一样97J平坦软件园
当create==false时,这个方法的作用是:根据客户端传递过来的session的id,寻找服务器端的session,如果找到返回,如果没有找到,返回null;97J平坦软件园

String ID=session.getId();97J平坦软件园
session.setAttribute("isLogin", true);97J平坦软件园
当对客户端作出响应的时候,会将session的ID包装成一个cookie对象(名字为JSESSIONID,值为session的id),返回给客户端97J平坦软件园

97J平坦软件园
HttpSession消失的情况:97J平坦软件园
1)web应用停止97J平坦软件园
2)超时(上一次访问开始的时间到当前时间,如果这个时间超过了指定的超时时间,那么就认为是超时了)97J平坦软件园
可在web.xml中可配置session的超时时间:97J平坦软件园

3)调用session对象的invalidate方法97J平坦软件园
通过URL重写解决cookie禁用sesion不能访问的问题:97J平坦软件园
当客户端禁用cookie之后,无法通过cookie保存session的id我们可以通过URL重写来保存session的id97J平坦软件园
url;jsessionid=HJGKJWBDRUWRGW97J平坦软件园
String oldUrl = "sessionCheck";97J平坦软件园
String newUrl = response.encodeURL(oldUrl);// encodeUrl已不建议使用97J平坦软件园

三个范围(scope)97J平坦软件园
requestScope(ServletRequest):在多个servlet之间进行服务器内部跳转的时候,我们可以通过将数据放在request对象中进行数据的传递。97J平坦软件园
request.setAttribute(key,value);97J平坦软件园
Object value=request.getAttribute(key);97J平坦软件园
request.removeAttribute(key);97J平坦软件园

sessionScope(HttpSession):session中一般存放一些状态信息,或者在整个会话中经常要使用的数据(不建议存放过多数据(影响服务器效率))97J平坦软件园
session.setAttribute(key,value);97J平坦软件园
Object value=session.getAttribute(key);97J平坦软件园
session.removeAttribute(key);97J平坦软件园

applicationScope(ServletContext):ServletContext一般存放整个系统运行过程中,经常要使用的数据97J平坦软件园
ctx.setAttribute(key,value);97J平坦软件园
Object value=ctx.getAttribute(key);97J平坦软件园
ctx.removeAttribute(key);97J平坦软件园

过滤器:Filter97J平坦软件园

web应用的事件的处理机制97J平坦软件园
1.事件源97J平坦软件园
web容器97J平坦软件园

2.事件对象:由web容器创建97J平坦软件园
在web应用启动和停止的时候产生:ServletContextEvent 在javax.servlet 包中97J平坦软件园
会话开始和结束的时候产生:HttpSessionEvent 在javax.servlet.http 包中97J平坦软件园
请求开始和结束的时候:ServletRequestEvent 97J平坦软件园
对application范围中的数据操作的时候产生:ServletContextAttributeEvent 97J平坦软件园
对session范围内的数据进行操作的时候产生: HttpSessionBindingEvent 97J平坦软件园
对requset范围中的数据操作进行操作的时候产生: ServletRequestAttributeEvent 97J平坦软件园

3.监听器97J平坦软件园

处理ServletContextEvent事件对应ServletContextListener 接口(执行时间:web应用启动和停止)97J平坦软件园
处理HttpSessionEvent事件 HttpSessionListener 执行时间:session(会话)开始和结束97J平坦软件园
处理ServletRequestEvent 事件 ServletRequestListener 执行时间:请求的开始和结束97J平坦软件园
处理ServletContextAttributeEvent 事件 ServletContextAttributeListener 97J平坦软件园
执行时间:加入数据,删除数据,替换数据97J平坦软件园
HttpSessionBindingEvent HttpSessionAttributeListener 执行时间:加入数据,删除数据,替换数据 97J平坦软件园

ServletRequestAttributeEvent ServletRequestAttributeListener 97J平坦软件园
执行时间:加入数据,删除数据,替换数据 97J平坦软件园

注册监听器:在web.xml中描述就可以完成监听器的工作.97J平坦软件园

97J平坦软件园

一、 过滤器 Filter 97J平坦软件园
1. why Filter? 97J平坦软件园
   针对通用WEB服务、功能,透明的处理 97J平坦软件园

2. 什么是 Servlet Filter? 97J平坦软件园
     过滤是 Servlet 2.3 版才引入的新特性。过滤器可以认为是实现 Http 请求、响应以及头信息等内容的传送的代码片断。 97J平坦软件园
     过滤器并不能创建响应,但它可以“过滤”传给 servlet 的请求,还可以“过滤”从 servlet发送到客户端的响应; 97J平坦软件园
     它不仅能处理静态内容,还可以处理动态内容。换而言之,filter 其实是一个“servlet chaining”(servlet 链)。 97J平坦软件园
   一个 filter 包括: 97J平坦软件园
    1) 在 servlet 被调用之前截获; 97J平坦软件园
    2) 在 servlet 被调用之前检查 servlet request; 97J平坦软件园
    3) 根据需要修改 request 头和 request 数据; 97J平坦软件园
    4) 根据需要修改 response 头和 response 数据; 97J平坦软件园
    5) 在 servlet 被调用之后截获.97J平坦软件园

3. 过滤器的生命周期 97J平坦软件园
   Filter 组件的生命周期与 Servlet 的类似。 97J平坦软件园
   过滤器有四个阶段(与servlet类似): 97J平坦软件园
    1) 实例化; 97J平坦软件园
    2) 初始化(调用init()方法); 97J平坦软件园
    3) 过滤(调用doFilter()方法); 97J平坦软件园
    4) 销毁(调用destroy()方法);97J平坦软件园

4. Filter编程 97J平坦软件园
   1)定义Filter(implements Filter) 97J平坦软件园
   2)配置Filter 97J平坦软件园
     配置对哪些资源进行过滤(url)97J平坦软件园

     <filter> 97J平坦软件园
        <filter-name>Logger</filter-name>                   //过滤器名 97J平坦软件园
        <filter-class>com.LoggerFilter</filter-class>       //具体过滤器类 97J平坦软件园
        <init-param>                                        //初始化参数 97J平坦软件园
           <param-name>xsltfile</param-name> 97J平坦软件园
           <param-value>/xsl/stockquotes.xsl</param-value> 97J平坦软件园
        </init-param> 97J平坦软件园
     </filter> 97J平坦软件园
     <filter-mapping>                 97J平坦软件园
         <filter-name>Logger</filter-name> 97J平坦软件园
         <url-pattern>/*</url-pattern> //将过滤器应用于Web应用中的每个Web资源;可以只指定某个资源 97J平坦软件园
     </filter-mapping>97J平坦软件园

5. FilterChain 97J平坦软件园
   1) chain是如何配置,顺序 97J平坦软件园
      当同一个应用中配置了多个 filter 时,其执行顺序是如何的呢? 97J平坦软件园
      答:按 web.xml 中<filter-mapping>的顺序来执行的 97J平坦软件园
   2) chain.doFilter(req, resp) 97J平坦软件园
      调用下一个Filter,到最后一个Filter则正式调用 TargetServlet 97J平坦软件园
   3) 调用过程(类似于递归调用)97J平坦软件园

6. Filter的类型 97J平坦软件园
   Filter 有4种类型,主要体现在<filter-mapping>中的<dispatcher>属性: 97J平坦软件园
   <dispatcher>REQUEST</dispatcher>       默认,客户端的直接的请求,才触发该过滤器 97J平坦软件园
   <dispatcher>FORWARD</dispatcher>       servlet 调用 rd.forward(req,resp)时触发 97J平坦软件园
   <dispatcher>INCLUDE</dispatcher>       servlet 调用 rd.include(req,resp)时触发 97J平坦软件园
   <dispatcher>ERROR</dispatcher>         发生错误,跳转到错误页面时触发97J平坦软件园

二、监听器 Listener 97J平坦软件园
    Listener 是 Servlet 的监听器,它可以监听客户端的请求、服务端的操作等。通过监听器,可以自动激发一些操作。 97J平坦软件园
    如:监听在线的用户数量。当增加一个session时,就激发sessionCreated(HttpSessionEvent se),给在线人数加1 97J平坦软件园
1. 监听器的种类 97J平坦软件园
   一共分三大类型,有 8 种 listener: 97J平坦软件园
    a.监听 servlet context 97J平坦软件园
      1)生命周期事件 97J平坦软件园
        接口: javax.servlet.ServletContextListener 97J平坦软件园
        内容: servlet 上下文已经被创建,并且可以用来向其第一个请求提供服务,或者 servlet 上下文即将关闭 97J平坦软件园
      2)属性的改变 97J平坦软件园
        接口: javax.servlet.ServletContextAttributeListener 97J平坦软件园
        内容: 在 servlet 上下文中,增加、删除或者替换属性 97J平坦软件园
    b.监听 servlet session 97J平坦软件园
      1)生命周期事件 97J平坦软件园
        接口: javax.servlet.http.HttpSessionListener 97J平坦软件园
        内容: 对一个 HttpSession 对象进行创建、失效处理或者超时处理 97J平坦软件园
      2)属性改变 97J平坦软件园
        接口: javax.servlet.http.HttpSessionAttributeListener 97J平坦软件园
        内容: 在 servlet 会话中,增加、删除或者替换属性 97J平坦软件园
      3)会话迁移 97J平坦软件园
        接口: javax.servlet.http.HttpSessionActivationListener 97J平坦软件园
        内容: HttpSession 被激活或者钝化 97J平坦软件园
      4)对象绑定 97J平坦软件园
        接口: javax.servlet.http.HttpSessionBindingListener 97J平坦软件园
        内容: 对 HttpSession 中的对象进行绑定或者解除绑定 97J平坦软件园
    c.监听 servlet request 97J平坦软件园
      1)生命周期 97J平坦软件园
        接口: javax.servlet.ServletRequestListener 97J平坦软件园
        内容: 一个 servlet 请求开始由 web 组件处理 97J平坦软件园
      2)属性改变 97J平坦软件园
        接口: javax.servlet.ServletRequestAttributeListener 97J平坦软件园
        内容: 在 ServletRequest 中,增加、删除或者替换属性97J平坦软件园

   Servlet环境配置 97J平坦软件园
JAVA_HOME=/XXX/XXX/(JDK路径,bin的上一层目录) 97J平坦软件园
CATALINA_HOME=/XXXX/XXX(tomcat的绝对路径 windows中 X:/xxx/xxx)97J平坦软件园

            Tomcat使用 97J平坦软件园
在启动Tomcat时,是运行Tomcat的bin目录下的startup.sh(windows中使用startup.bat) 97J平坦软件园
Linux中要显示后台的具体信息,则用catalina.sh run 代替startup.sh命令。 97J平坦软件园
判断Tomcat是否启动成功,可以在浏览器的地址栏中使用 http://localhost:8080/http://127.0.0.1:8080/ 可以访问到tomcat的主页就表示启动成功。 97J平坦软件园
要想停止tomcat服务器,可使用shutdown.sh(windows中使用shutdown.bat),如果直接关闭启动窗口,就会造成8080端口占用错误,这时可以再使用shutdown.sh关闭一下服务器。97J平坦软件园

        Servlet开发步骤 97J平坦软件园
编写servlet源代码,注意servlet的结构。 97J平坦软件园
编译servlet,需要servlet-api.jar文件(位于$Tomcat/common/lib/目录下;加入classpath环境变量中) 97J平坦软件园
部署servlet 97J平坦软件园
   编写配置文件web.xml:其中包括servlet burl与 servlet name的映射, 97J平坦软件园
   以及servlet name 与 servlet class name的映射。 97J平坦软件园
构造web应用程序目录结构如下: 97J平坦软件园
└─MyWebApp           应用程序名 97J平坦软件园
   └─WEB-INF 97J平坦软件园
       └─classes 97J平坦软件园
       └─lib 97J平坦软件园
   └─*.html/*.jsp 97J平坦软件园
配置文件web.xml放在WEB-INF目录下 97J平坦软件园
servlet类文件放在classes目录下 97J平坦软件园
将整个应用程序目录拷贝到 $Tomcat/webapps/ 目录下97J平坦软件园

使用此结构的优点 97J平坦软件园
一个Web容器中可以共存多个Web应用程序。 97J平坦软件园
Web容器知道该到何处寻找装入Web应用程序所需的类。97J平坦软件园

97J平坦软件园
                  web.xml文件的写法 97J平坦软件园
<?xml version="1.0" encoding="ISO-8859-1"?> 97J平坦软件园
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 97J平坦软件园
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 97J平坦软件园
   xsi:schemaLocation=http://java.sun.com/xml/ns/j2ee 97J平坦软件园
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd version="2.4"> 97J平坦软件园
<servlet> 97J平坦软件园
<servlet-name>IpLogServlet</servlet-name> 97J平坦软件园
<servlet-class>tarena.servlet.lc.IpLogServlet</servlet-class> 97J平坦软件园
   <init-param> 97J平坦软件园
<param-name>filename</param-name>        //getServletConfig().getInitParameter(); 97J平坦软件园
<param-value>c:/iplog.txt</param-value> 97J平坦软件园
   </init-param> 97J平坦软件园
   <load-on-startup>2</ load-on-startup > //启动服务器时就创建该servlet实例,必须是正数,小的数先加载 97J平坦软件园
</servlet> 97J平坦软件园
<servlet-mapping> 97J平坦软件园
<servlet-name>IpLogServlet</servlet-name> //要和servlet标签中的相同 97J平坦软件园
<url-pattern>/lc/iplog</url-pattern> //指定servlet相对于应用目录的虚拟路径 97J平坦软件园
</servlet-mapping>                       /xxx/xxx(绝对路径),xxx(相对路径) 97J平坦软件园
</web-app>97J平坦软件园

绝对路径开头的“/”代表 http://localhost:8080/97J平坦软件园

             测试应用 97J平坦软件园
在tomcat服务器中,访问应用下的资源可以在端口号后加上web应用文件夹的名字,就可以看到资源 97J平坦软件园
http://localhost:8080/应用文件夹名/url-pattern 97J平坦软件园
静态页面只能放在web应用的文件夹下,不能够放在WEB-INF文件夹下,WEB-INF文件夹中的资源是受保护的,不能够通过网络访问到。97J平坦软件园

       Servlet的调用过程 97J平坦软件园
用户通过浏览器向web服务器发送请求 97J平坦软件园
http://serverip:port/appname 97J平坦软件园
服务器为用户定位资源 97J平坦软件园
   静态资源:/a.html /a/b.html (这里的路径是针对web应用文件夹目录)读文件并把内容发送到客户端。 97J平坦软件园
   动态资源:解析web.xml定位Servlet类的名字。 97J平坦软件园
装载类(WEB-INF/classes | WEB-INF/lib/*.jar) 97J平坦软件园
创建该对象的实例 97J平坦软件园
Servlet ser=(Servlet)(Class.forName("servle的类名")).newInstance(); 97J平坦软件园
//我们写的Servlet一定要实现Servlet接口或者继承实现了Servlet接口的类 97J平坦软件园
ser.service(request,response);97J平坦软件园

     用Servlet处理表单数据 97J平坦软件园
FORM元素的属性 97J平坦软件园
action: 用来指定要处理FORM数据的Servlet的URL 97J平坦软件园
method: 指定数据传送给HTTP服务器的方法 97J平坦软件园
解析请求 97J平坦软件园
getParameterNames:可以获得一个迭代器Enumeration,通过这个迭代器,来获得form表单中参数的名字。 97J平坦软件园
getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null; 没有任何值,返回空String);多参数同名时,只取一个。 97J平坦软件园
getParametervalues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组);97J平坦软件园

            get & post 97J平坦软件园
在浏览器的地址栏操作按回车键,或者是热连接,都是get请求,form的method属性如果不指定,默认为get请求(传的数据不能太大,且表现为明文)。 97J平坦软件园
get请求,会将参数显示在浏览器的地址栏上,其显示格式,在地址之后会以?开始,以'&'分隔参数,可以通过HttpServletRequest对象的getQueryString()方法来获得get请求的参数值。 97J平坦软件园
post请求:ServletRequest对象的getInputStream()方法可以获得一个由Socket得来的输入流,可以使用这个流来实现文件的上传。getReader()方法可以直接获取post请求的参数。97J平坦软件园

     Servlet的生命周期 97J平坦软件园
创建Servlet对象,通过服务器反射机制创建Servlet实例,默认第一次请求时才会创建。 97J平坦软件园
调用Servlet对象的init()方法,初始化Servlet的信息,init()方法只会在创建后被调用一次。 97J平坦软件园
响应请求,调用service()或者是doGet(),doPost()方法来处理请求,这些方法是运行的在多线程状态下的。 97J平坦软件园
在长时间没有被调用或者是服务器关闭时,会调用destroy()方法来销毁Servlet对象。97J平坦软件园

Servlet对客户端提供服务的时序图(插图见Servlet_Note.pdf,P16) 97J平坦软件园
Servlet生命周期状态图(插图见Servlet_Note.pdf,P17)97J平坦软件园

      init方法 97J平坦软件园
当首次创建Servlet时就会调用init方法, 而不是每个用户请求都会调用该方法。 97J平坦软件园
我们可以在init方法中完成类似于构造方法的初始化功能。 97J平坦软件园
init方法一结束,servlet即可接受客户端请求;97J平坦软件园

           init方法实例 97J平坦软件园
覆盖init(ServletConfig conf)方法时,应该总是在首行调用super.init();或者直接覆盖init(); 97J平坦软件园
init方法接受ServletConfig作为参数, 用以下方法获得参数值: 97J平坦软件园
getInitParameter: 返回指定参数名称对应的值,如果参数不存在,返回null; 97J平坦软件园
getInitParameterNames: 返回所有初始化参数的名字 ;97J平坦软件园

       service方法 97J平坦软件园
每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程, 并调用service。 97J平坦软件园
service方法检查HTTP请求类型,并相应地调用doGet、doPost、doPut、doDelete。 97J平坦软件园
被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest);97J平坦软件园

   Servlets的多线程安全 97J平坦软件园
多线程占用资源少,处理速度快,提高了效率。 97J平坦软件园
一些编码建议: 97J平坦软件园
对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题; 97J平坦软件园
同步化所有访问重要数据的实例变量; 多线程下,如果操作的是一个变量,且兼有读写操作, 97J平坦软件园
就要考虑加上同步,但同步不能乱加,否则会造成死锁问题。97J平坦软件园

         并发需要注意的 97J平坦软件园
并发的环境:资源处于一个并发的环境 97J平坦软件园
共享资源:多个线程共享一个临界资源 97J平坦软件园
全面同步:如有n个变量访问同一个资源,这n个变量都得同步。即多个锁一把钥匙,钥匙放在一个共享区域内 97J平坦软件园
sychronized(this):粗粒度的锁。是将所有的路都加锁; 97J平坦软件园
sychronized(object o1):细粒度的锁。只对对象中的变量加锁。效率较前面的高,但是较难控制。 97J平坦软件园
读写需要互斥。 97J平坦软件园
sychronized(this):this不能是基本数据类型,必须是Object.不锁对象的引用,而是对象的内存空间。 97J平坦软件园
servlet中需要同步的:成员变量、文件、静态变量、数据库连接97J平坦软件园

      destroy方法 97J平坦软件园
服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法; 97J平坦软件园
该方法允许Servlet: 97J平坦软件园
关闭数据库连接; 97J平坦软件园
中止后台线程; 97J平坦软件园
将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。 97J平坦软件园
在Servlet终止时处理Service线程 97J平坦软件园
在destroy()方法中:如有服务(通过一个同步化的实例方法取得当前线程数大于0),则置关闭状态为false(通过一个同步化的实例方法实现)。然后循环等待服务线程数为0,则置关闭状态为true. 97J平坦软件园
在Service()方法中: 如见关闭状态为true,便不执行具体逻辑方法,直接退出。97J平坦软件园

HTTP servlet类的基本结构 97J平坦软件园
继承HttpServlet 97J平坦软件园
实现至少一个service方法,如:doGet(...)和doPost(...) 97J平坦软件园
service方法有两个参数,HttpServletRequest 和HttpServletResponse: 97J平坦软件园
HttpServletRequest代表经过容器加工的用户的请求 97J平坦软件园
HttpServletResponse代表需要容器进一步加工的对用户的响应 97J平坦软件园
我们写的servlet需要引入javax.servlet.* 和javax.servlet.http.* 两个命名空间97J平坦软件园

        servlet继承关系 97J平坦软件园
servlet主要数据结构: 97J平坦软件园
Servlet 接口:主要定义了servlet的生命周期方法 97J平坦软件园
ServletConfig接口:为servlet提供了使用容器服务的若干重要对象和方法。 97J平坦软件园
ServletContext接口:是Servlet的上下文对象,这个对象是在服务器启动时创建的,为servlet提供了使用容器服务的若干重要方法。 97J平坦软件园
GenericServlet抽象类:为servlet提供了一般的实现(包括实现了servlet和ServletConfig两个接口),保存了容器通过init方法传递给servlet的一个ServletConfig类型的重要对象。 97J平坦软件园
HttpServlet抽象类:为处理http请求的servlet提供了一般实现,主要是定义和实现了若干service方法。 97J平坦软件园
继承关系:GenericServlet继承了Servlet和ServletConfig接口;HttpServlet继承了GenericServlet; 97J平坦软件园
我们写的servlet继承了HttpServlet97J平坦软件园

Servlet访问DB(一个servlet完成整个功能) 97J平坦软件园
获取client端信息 ---> entity -------v 97J平坦软件园
调用相应的处理方法 ---> controller    | 97J平坦软件园
连接数据库 ---> util   ------------v 97J平坦软件园
操作信息数据 ---> biz    -------> model 97J平坦软件园
返回给client端相应的结果页面 ---> view 97J平坦软件园
                          97J平坦软件园
将一个servlet按功能细分 97J平坦软件园
将一个完成所有功能的servlet分解成多个, 97J平坦软件园
分别完成自己的功能,即形成了mvc。97J平坦软件园

MVC框架 (组件的各司其职) 97J平坦软件园
Model,模型层(封装数据 ),这一层一般是进行数据库访问,并且封装对象,这一层中也存放在访问数据库取出信息封装成对象的类,也就是实体类的信息,可以使用JDBC或者Hibernate实现这一层的功能。 97J平坦软件园
Ctrl,控制层(改变数据,改变模型的状态 ),用来相应请求和调用写好的相应的访问数据库的方法,这一层是用来控制请求的响应的,现在我们是使用Servlet来实现这一层,不过一般是会用开源的MVC框架来实现这层,例如struts,或者是Spring的MVC框架。 97J平坦软件园
View,表现层(显示数据和收集数据),收集数据的一般是form表单,不过要保证数据的正确性要是用JavaScript验证信息,以后我们会学到的JSP(java server page)就是用来表现、显示数据的。 97J平坦软件园
Servlet之间的怎么互相调用在上述基础上需要解决servlet之间的调用:可以利用servletContext解决每一个servlet都可能和上下文交互,则每个servlet中都应该保存一个servletContext对象,去访问整个应用的上下文, 步骤如下: 97J平坦软件园
getServletContext()::application 97J平坦软件园
application.getRequestDispatcher(“/res/students/list”)::dis 97J平坦软件园
patcher dispatcher.forward(request,response) 97J平坦软件园
每个JVM中的每一个应用程序里都存在一个上下文 97J平坦软件园
servletContext在servletConfig的对象中; 97J平坦软件园
ServletContext.getRequestDispatcher(String path):返回一个RequestDispatcher 97J平坦软件园
通过RequestDispatcher的forward()或include()方法传送请求。 97J平坦软件园
如何在一个servlet中调用另外一个 97J平坦软件园
              servlet: 97J平坦软件园
ServletContext类的getRequestDispatcher(Stringpath)方法获得一个RequestDispatcher对象,并且跳转到指定的Servlet,getRequestDispatcher(String path)方法中的参数就是path,就是指定跳转的Servlet的url-pattern。 97J平坦软件园
RequestDispatcher类的forward(ServletRequestrequest, ServletResponse response) 方法,可以把请求对象转发给其他的Servlet。97J平坦软件园

   在多个servlet中传递信息: 97J平坦软件园
HttpServletRequest对象中的方法 97J平坦软件园
setAttribute(String name,Object o),可以使用HttpServletRequest对象来携带信息,并且可以通过getAttribute(String name)方法来获得携带的信息,这两个方法类似于map中的存取方法,setAttribute方法给数据加上标识,getAttribute方法则是通过这个标识来获取数据,可以使用这一对方法的前提就是要保证是同一个请求对象(HttpServletRequest)97J平坦软件园

       转发请求至新的资源 97J平坦软件园
request dispatcher的二种传送请求方式 97J平坦软件园
   Forward: 将请求从一个servlet传到服务器上的其他资源 97J平坦软件园
   (servlet、JSP、HTML); 97J平坦软件园
   Include: 将静态或动态内容包含在当前servlet中; 97J平坦软件园
获得request dispatcher的二种方式: 97J平坦软件园
   ServletRequest.getRequestDispatcher()     // 相对路径 97J平坦软件园
   ServletContext.getRequestDispatcher()     // 绝对路径 97J平坦软件园
Response.sendRedirect(/servapp/state/login); //要写绝对路径,产生新的请求, 97J平坦软件园
Forward(req,resp);//在当前路径基础上跳转 97J平坦软件园
   两个页面之间跳转的时侯如果需要数据传递,则只能用 97J平坦软件园
   forward();因为sendRedirect()会产生一个新的请求。 97J平坦软件园
servlet中使用数据源访问数据库 97J平坦软件园
在服务器中配置数据源(使用admin管理界面) 97J平坦软件园
再servlet中使用JNDI语法获取数据源 97J平坦软件园
Context context = new InitalContext(); 97J平坦软件园
DataSource ds =(DataSource) 97J平坦软件园
context.lookup("java:comp/env/"+dsName); 97J平坦软件园
Connection con = ds.getConnection(); 97J平坦软件园
新建一个配置文件myapp.xml(假设web应用程序名称为:myapp),将xml文件的头部和一对<Context>标签写入该文件,将server.xml中有关数据源配置的<Resource>标签内容拷贝到myapp.xml中的<context>标签之间。server.xml位于$tomcat/conf/文件夹下,myapp.xml放在$tomcat/conf/catalina/localhost/文件夹下。97J平坦软件园

      数据源配置Server.xml 97J平坦软件园
<Resource 97J平坦软件园
   name="jdbc/oracle" 配置JDNI的名字 97J平坦软件园
   type="javax.sql.DataSource" 绑定资源的类型 97J平坦软件园
   password=“openlab" 97J平坦软件园
   driverClassName="oracle.jdbc.driver.OracleDriver" 驱动名 97J平坦软件园
   maxIdle=“1”最大空闲连接数 97J平坦软件园
   maxWait="-1"等待时间,配置为-1就是无限等待,直到有空闲连接为止 97J平坦软件园
   username=“open123" 97J平坦软件园
   url="jdbc:oracle:thin:@192.168.0.39:1521:TARENADB" 97J平坦软件园
   maxActive="3" 最大活动连接数/> 97J平坦软件园
     会话管理 97J平坦软件园
为什么要使用session? 97J平坦软件园
一般来讲,从同一客户打开浏览器连接到服务再到客户关闭浏览器可称为一次会话(中间浏览器可以打开多个窗口) 97J平坦软件园
通信协议分为有状态和无状态两种。Http协议是一种无状态协议。一个客户向服务器发出请求然后服务器返回响应,连接就被关闭了。在服务器端不保留连接的有关信息.因此当下一次连接建立时,服务器已没有以前连接的信息了,无法判断这一次连接和以前的连接是不是属于同一客户发出的。在实际应用中,客户进行一个事务性的操作可能需要对服务器进行好几次连接,这时维护前几次连接的状态就非常重要。 97J平坦软件园
服务器必须能够区分不同的客户,而且还要有为每一个客户存储数据的方法。97J平坦软件园

session实现的三种方法 97J平坦软件园
Cookie 97J平坦软件园
URL Rewriting 97J平坦软件园
隐藏表单域 97J平坦软件园
使用java servlet API进行会话管理 97J平坦软件园
          (session) 97J平坦软件园
java servlet API 主要提供了两个与会话相关 97J平坦软件园
的类和接口:Cookie和HttpSession 97J平坦软件园
                 Cookie 97J平坦软件园
控制机制: 97J平坦软件园
⊕Browser---------request----- Web server 97J平坦软件园
⊕Web server---------request+info--------- Browser 97J平坦软件园
⊕Browser---------request+info-------- Web server(客户端 97J平坦软件园
带信息来再次访问其标志的资源) 97J平坦软件园
详细解释 97J平坦软件园
Cookie是一小块可以嵌入到Http请求和相应中的数据。 97J平坦软件园
它在服务器端产生,并作为响应头域的一部分返回用户。浏览器收到包含Cookie的响应后,会把Cookie的内容用key-value对的形式写入到一个客户端专门存放Cookie的文本文件中(c:/documents and setting/$user/Cookies)。浏览器会把Cookie及随后产生的请求发给相同的服务器,服务器可以再次读取 Cookie中存放的数据。 97J平坦软件园
Cookie可以进行有效期的设置,过期的Cookie不会发送给服务器。 97J平坦软件园
Cookie的用法: 97J平坦软件园
获取Cookies:Cookie[] all = request.getCookies(); 97J平坦软件园
获取Cookies名字:Cookie[i].getName(); 97J平坦软件园
获取Cookies的值:Cookie[i].getValue(); 97J平坦软件园
为Cookies设置新值:Cookie[i].setValue(); 97J平坦软件园
设置Cookie保存的最大期限: 97J平坦软件园
Cookie[i].setMaxAge (int expiry);毫秒 97J平坦软件园
以cookie实现的session的流程: 97J平坦软件园
Browser访问 Web server---- Web server 97J平坦软件园
分给用户一个jsessionId并返回给用户保存在本地,同时将jsessionId保存在session中--- 用户再次访问本Web server时带着 jsessionId来访问------ Web server根据用户传过来的jsessionId跟session中的 jsessionId比较,如果有相同的,就将这个jsessionId对应的session返回给用户,这样用户可以看到上一次的访问信息。97J平坦软件园

            HttpSession 97J平坦软件园
javax.servlet.http.HttpSession接口封装了HTTP会话的细节,该会话与一段时间内特定的web客户对web服务器的多个请求相关。它由Servlet容器环境实现。对Servlet的开发者隐藏实现的细节。 97J平坦软件园
在Servlet中进行会话管理时,首先要获得会话对象。HttpServletRequest.getSession()对象返回与请求相关的当前HttpSession对象,并且该对象不存在时就创建一个新的对象。 97J平坦软件园
HttpServletRequest.getSession(true)具有相同的功能。如果参数是false,当不存在会话对象的时候就不创建新的,而是返回一个Null值。97J平坦软件园

       容器做的事情 97J平坦软件园
产生不重复的jsessionId; 97J平坦软件园
将jsessionId和session对象映射成表; 97J平坦软件园
将jsessionId返回给用户 97J平坦软件园
(cookie/urlRewriting); 97J平坦软件园
再次访问时,先在表中查jsessionId对应的session; 97J平坦软件园
将查到的session对象的引用放入request给用户。 97J平坦软件园
     用户做的事情 97J平坦软件园
request.getSession(); 97J平坦软件园
request.setAttribute(); 97J平坦软件园
request.getAttribute(); 97J平坦软件园
   servlet的会话机制(servlet将 97J平坦软件园
cookie/urlRewriting封装而成) 97J平坦软件园
底层的cookie和url之间的过程被封装; 97J平坦软件园
urlRewriting的细节被屏蔽,即jsessionId由容器生成,jsessionId列表由容器维护; 97J平坦软件园
状态对象由容器维护; 97J平坦软件园
容器提供了在状态对象中存取数据的方法;会话状态会被自动持久化。97J平坦软件园

    URL Rewriting 97J平坦软件园
Cookies可以用来跟踪某一用户向站点发出的每一个请求,有人认为web站点管理员能都收集到用户所浏览网页的足够信息。这侵犯 97J平坦软件园
了用户的个人隐私权,所以某些用户会关闭浏览器的Cookie功能。这样的话就要求程序员事先在实现Cookie的同时也实现重写URL,那当Cookie失效的时候重写URL就会替代Cookie发挥作用。 97J平坦软件园
Servlet中的数据可见范围和生命周期: 97J平坦软件园
一个应用只有一个上下文对象。97J平坦软件园

            Filter 97J平坦软件园
链式结构的问题. 97J平坦软件园
f.doFilter(r,r) 97J平坦软件园
过滤器是没有url的servlet 97J平坦软件园
容器知道filter的转发顺序,通过配置文件 97J平坦软件园
web.xml中的位置决定执行先后 97J平坦软件园
所以filter就解放了.97J平坦软件园

2004-9-16 星期四 晴 Servlet的基础概念 97J平坦软件园
1. Servlet是什么? 答: 97J平坦软件园
1) 模块化的程序,运行在服务器端,增强了请求/响应导向服务; 97J平坦软件园
2) 应用示例: a. 访问远端对象; b. 跟踪大量信息; c. 多用户协作 97J平坦软件园
2. HTTP和Servlets 答: 97J平坦软件园
1) Servlet是HTTP协议中作为CGI的一个替代品; 97J平坦软件园
2) HttpServlet类用于开发HTTP为基础的Servlet 97J平坦软件园
3. HttpServlet 答: 97J平坦软件园
1) 继承抽象类javax.servlet.GenericServlet,实现接口java.io.Serializable; 97J平坦软件园
2) 用以开发Http协议为基础的Servlet 97J平坦软件园
4. 服务方法 答: 97J平坦软件园
1) 每当服务接收到对Servlet的请求时,服务器就会产生一个新线程,并调用Service。service方法检查HTTP请求类型(GET、POST、PUT、DELETE等),并相应地调用doGet、doPost、doPut、doDelete等。 97J平坦软件园
2) doGet/doPost方法接收HttpServletRequest和HttpServletResponse对象。 97J平坦软件园
3) 99%的时间里,只需注意GET和/或POST请求; 97J平坦软件园
4) 没有任何doHead方法。 97J平坦软件园
5. 返回响应 答: 97J平坦软件园
1) PrintWriter out = response.getWriter // 用于返回文本数据给客户端 97J平坦软件园
2) ServletOutputStream out = response.getOutputStream // 用于返回二进制数据给客户端 97J平坦软件园
6. 支持Servlet的Web服务器 答: 97J平坦软件园
1) J2EE应用服务器包括:Web Container和EJB Container; 97J平坦软件园
2) Web Container的Servlet Engine提供对Servlet的运行支持;97J平坦软件园

2004-9-17 星期五 晴 用Servlet处理表单数据 97J平坦软件园
1. Form元素的属性 答: 97J平坦软件园
1) ACTION: 用来指定要处理FORM数据的Servlet的URL,也可以指定FORM数据将要发送到的电子邮件; 97J平坦软件园
2) METHOD: 指定数据传送给HTTP服务器的方法; 97J平坦软件园
3) ENCTYPE: 指定数据在传输之前进行编码的方式, 97J平坦软件园
   例multipart/form-data 编码将每个字段作为MIME可兼容的文档的单独部分传输。 97J平坦软件园
2. 解析请求 答: 97J平坦软件园
1) 对于所有的请求: 97J平坦软件园
   a. getParameterNames: 以Enumeration形式获取表单中清单, 每一项都可以转换成String; 97J平坦软件园
   b. getParameter: 返回表单中参数名(区分大小写)对应的值(没有这样的参数,返回null;没有任何值,返回空String); 97J平坦软件园
   c. getParameterValues: 返回表单中参数名(区分大小写)对应的字符串数组(没有这样的参数,返回null;只有一个值,返回值为单一元素组); Servlet的生命周期 97J平坦软件园
1. Servlet的生命周期 答: 97J平坦软件园
1) 通过web Container装载(J2EE的组件都是被动地装载入Container)并实例化Servlet对象; 97J平坦软件园
2) 调用init()方法(在整个生命周期中只被调用一次); 97J平坦软件园
3) 调用service()方法(在整个生命周期中可被调用多次); 97J平坦软件园
4) 调用destroy()方法(在整个生命周期中只被调用一次); 97J平坦软件园
2. init方法 答: 97J平坦软件园
1) 当首次创建Servlet时就会调用init方法, 而不是每个用户请求都会调用该方法。 97J平坦软件园
2) 除非被destroy方法移除,否则不能被重载; 97J平坦软件园
3) init方法一结束,servlet即可接受客户端请求; 97J平坦软件园
3. init方法实例 答: 97J平坦软件园
1) 在编写接受ServletConfig作为参数的init方法时,应该总是在首行调用super.init; 97J平坦软件园
2) init方法接受ServletConfig作为参数, 用以下方法获得参数值: 97J平坦软件园
   a. getInitParameter: 返回指定参数名称对应的值,如果参数不存在,返回null; 97J平坦软件园
   b. getInitParameterNames: 返回指定参数名称对应的值枚举,如果参数不存在,返回的空枚举;97J平坦软件园

2004-9-20 星期一 阴 97J平坦软件园
3. service方法 答: 97J平坦软件园
1) 每当服务器接收到对Servlet的请求时,服务器就会产生一个新线程, 并调用service。 97J平坦软件园
   service方法检查HTTP请求类型,请相应地调用doGet、doPost、doPut、doDelete。 97J平坦软件园
2) 被container调用去响应(ServletResponse)来自客户端的请求(ServletRequest); 97J平坦软件园
4. Servlets的多线程安全 答: 97J平坦软件园
1) 多线程占用资源少,处理速度快,提高了效率。 97J平坦软件园
2) 一些编码建议: 97J平坦软件园
   a. 对变量和方法定义适当的访问方式, 例如单纯取值操作不会有多线程安全问题; 97J平坦软件园
   b. 同步化所有访问重要数据的实例变量; 97J平坦软件园
   c. 创建访问类变量的访问方法。 97J平坦软件园
5. SingleThreadModel接口 答: 97J平坦软件园
1) 如果希望禁止多线程访问,可以让Servlet使用SingleThreadModel接口: 97J平坦软件园
   public class YourServlet extends HttpServlet implements SingleThreadModel{ ... } 97J平坦软件园
2) 使用此接口,系统将保证不会存在多个请求线程同时访问Servlet的单个实例。 97J平坦软件园
   但是仍然需要同步对存储在Servlet外部的类变量或共享字段的访问。 97J平坦软件园
3) 如Servlet频繁被访问,则Servlet访问的同步将严重影响性能(延时)。 97J平坦软件园
6. destroy方法 答: 97J平坦软件园
1) 服务器决定删除已经加载的Servlet实例之前将调用Servlet的destroy方法; 97J平坦软件园
2) 该方法允许Servlet: 97J平坦软件园
   a. 关闭数据库连接; 97J平坦软件园
   b. 中止后台线程; 97J平坦软件园
   c. 将Cookie程序清单或访问计数写到磁盘以及执行其他类似的收尾工作。 97J平坦软件园
7. 在Servlet终止时处理Service线程 答: 97J平坦软件园
1) 在destroy()方法中: 97J平坦软件园
   如有服务(通过一个同步化的实例方法取得当前线程数大于0),则置关闭状态为true(通过一个同步化的实例方法实现)。 97J平坦软件园
   然后循环等待服务线程数为0. 97J平坦软件园
2) 在Service()方法中: 如见关闭状态为true,便不执行具体逻辑方法,直接退出。97J平坦软件园

2004-9-21 星期二 晴 资源访问 97J平坦软件园
1. 分布式JAVA技术 答: 97J平坦软件园
1) JDBC; a. 实现了Data和Client的分开; b. 通过简单的配置可以适用不同种类的数据库。 97J平坦软件园
2) RMI(RMI使用的协议为Internet Inter ORB Protocol); 97J平坦软件园
3) CORBA(核心技术为ORB:相应的你的请求转为另一个物理地址另一个不同语言对象的请求。 97J平坦软件园
   纯Java的情况下根本不用CORBA); 97J平坦软件园
2. 转发结果至可视页面 答: 97J平坦软件园
1) 用JavaBean(用来装载一组值,遵从一定协议的class)封装结果; 97J平坦软件园
2) 每个JVM中的每一个应用程序里都存在一个上下文; 97J平坦软件园
3) servletContext在servletConfig的对象中; 97J平坦软件园
4) ServletContext.getRequestDispatcher(String path):返回一个RequestDispatcher 97J平坦软件园
5) 通过RequestDispatcher的forward()或include()方法传送请求。 97J平坦软件园
3. 转发请求至新的资源 答: 97J平坦软件园
1) request dispatcher的二种传送请求方式 97J平坦软件园
   a. Forward: 将请求从一个servlet传到服务器上的其他资源(servlet、JSP、HTML); 97J平坦软件园
   b. Include: 包括静态或动态内容; 97J平坦软件园
2) 获得request dispatcher的二种方式: a. ServletRequest.getRequestDispatcher() // 相对路径 b. ServletContext.getRequestDispatcher() // 绝对路径 97J平坦软件园
3) 四种资源范围 97J平坦软件园
   a. javax.servlet.ServletContext: 整个应用程序范围内; 97J平坦软件园
   b. javax.servlet.http.HttpSession: 会话期间; 97J平坦软件园
   c. javax.servlet.ServletRequest: 一个请求期间; 97J平坦软件园
   d. javax.servlet.jsp.PageContext: 一个JSP页面;97J平坦软件园

2004-9-22 星期三 晴 Servlets中的持久状态 97J平坦软件园
1. HTTP协议中无状态的优缺点: 97J平坦软件园
优点:可以服务很多客户端; 97J平坦软件园
缺点:不能在多个请求之间共享信息(通过Cookie和Session解决); 97J平坦软件园
2. Cookies 答: 97J平坦软件园
1) Cookies是Web服务器发送到浏览器的简短文本信息,以后在访问同一个Web站点或域时浏览器就会毫无更改地返回该文本信息。 97J平坦软件园
2) 用户可以决定是否接受Cookie。 97J平坦软件园
3) 一个Cookie由以下内容组成: a. 名称; b. 单个值; c. 一些操作属性:路径或所在域、有效期以及版本号。 97J平坦软件园
4) 每个站点,浏览器通常只接受20条Cookie,总共接受300条,以及每条Cookie限制为4KB。 97J平坦软件园
3. 设置Cookie 答: 97J平坦软件园
1) 创建Cookie: Cookie c = new Cookie("CookieName", "CookieValue"); 97J平坦软件园
2) 设置有效期: c.setMaxAge(int lifetime); []

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics