`
kidiaoer
  • 浏览: 806365 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

servlet总结

阅读更多
servlet总结 
Servlet
C/S--->client/service
优点:
1)运行效率较高
2)交互性强适合局域网,
缺点:升级维护困难
B/S-->WEB应用 browser浏览器 Service
优点:无需关心客户端,升级维护,只需操作服务器即可.比较方便.
缺点:
1)交互性是请求/响应式,需要通过网络进行交互,效率相对c/s架构的软件来说较低.
2)要开发交互性较强的界面比较困难.
CGI:最早开发b/s架构的一门技术
从CGI分出 1)微软的ASP--->ASP.NET
2)JAVA的Servlet--->jsp

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

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

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

}

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

web工程(IDE):通过工程可创建web应用

web应用:(成品软件)

javax.servlet.Servlet(接口)

javax.servlet.GenericServlet(抽象类)

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


tomcat由于已经启动无法启动 用命令 ps -ef|grep tomcat 在kill -9 进程号


form表单处理:
1.提供表单
a)提供一个html页面包含一个form表单

b)提供一个servlet返回一个form表单
form表单action属性指定的路径
a)相对路径
register
b)绝对路径
/servlet/form/register

2.中文乱码问题
a)get方式提交
解决办法,在服务器中设置客户端提交请求的URI的编码类型
在server.xml中 <Connector 加 URIEncoding="UTF-8"
b)post方式提交
在server中获得客户端提交的参数之前,调用req对象的setCharacterEncoding方法设定编码类型。
c)响应
在server中获得输出流之前,调用response对象的的setCharacterEncoding方法设定编码类型。

3.method="get"和method="post" (form表单的两种提交方式比较)
get请求:
a)直接在浏览器地址栏输入请求的URL发起的请求:
b)点击一个超连接发起的请求
c)提交一个form表单但form表单的method不指定或指定get的时候
特点:
提交的数据放在请求的头部,一般在查询数据的时候我们会选择get方法发起请求
post请求:
a)提交一个method属性指定为post的表单发起的请求.
特点:
提交的数据放在请求体部,在向客户端提交数据的时候我们会选择使用post方式发起请求.

4.request/response对象中的方法

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

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


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

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

在GenericServlet中已经对有参的init方法作了实现
public abstract class GenericServlet implement Servlet{
private ServletConfig config;
public void init(ServletConfig config){
this.config=config;
this.init();

public void init(){

}
}
3)服务阶段
调用者:web容器
public void service(ServletRequest req,ServletResponse res){

}
在HttpServlet中已经对service方法作了实现
public abstract class HttpServlet extends GenericServlet{
public void service(ServletRequest req,ServletResponse res){
HttpServletRequest hReq=(HttpServletRequest)req;
HttpServletResponse hRes=(HttpServletResponse)res; 
service(hReq,hRes);
}
public void service(HttpServletRequest hReq, HttpServletResponse hRes){
String method=hReq.getMethod();

if(method.equals("GET")){
doGet(hReq,hRes);
}else if(method.equals("POST")){
doPost(hReq,hRes);
}
}
//被子类覆盖
public void doGet(HttpServletRequest request, HttpServletResponse response) {

}
//被子类覆盖
public void doPost(HttpServletRequest request, HttpServletResponse response){

}
}
4)销毁阶段
调用者:web容器
public void destory{

}

注:init(),service(),destroy()称为servlet对象的生命周期回掉方法.

web应用的逻辑分层:
model(模型):
javabean,ejb..
view(显示):
servlet,jsp等
control(控制):
servlet,jsp....

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

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

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

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

作业:

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

3.在UserManager中提供查询用户的方法.


Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup(jndiName);

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


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


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

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

cookie
创建:       name        value

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

获取:
Cookie[] cookies=request.getCookies();


session(结合cookie使用):创建和保存都在服务器端

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

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


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

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

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

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

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

过滤器:Filter

web应用的事件的处理机制
1.事件源
web容器

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

3.监听器

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

ServletRequestAttributeEvent ServletRequestAttributeListener
执行时间:加入数据,删除数据,替换数据

注册监听器:在web.xml中描述就可以完成监听器的工作.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics