servlet总结1
servlet 总结ServletC/S--->Client/Server(客户机/服务器)优点:1)运行效率较高2)交互性强适合局域网,缺点:升级维护困难B /S -->Browser/Server
servlet 总结
Servlet
C/S--->Client/Server(客户机/服务器)
优点:
1)运行效率较高
2)交互性强适合局域网,
缺点:升级维护困难
B /S -->Browser/Server(浏览器/服务器)
优点:无需关心客户端, 升级维护, 只需操作服务器即可. 比较方便.
缺点:
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:
协议://地址(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 中 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)第一次访问的时候创建 当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 中描述就可以完成监听器的工作. 一、 过滤器 Filter 1. why Filter? 针对通用WEB 服务、功能,透明的处理 2. 什么是 Servlet Filter? 过滤是 Servlet 2.3 版才引入的新特性。过滤器可以认为是实现 Http 请求、响应以及头信息等内容的传送的代码片断。 过滤器并不能创建响应,但它可以“过滤”传给 servlet 的请求,还可以“过滤”从 servlet 发送到客户端的响应; 它不仅能处理静态内容,还可以处理动态内容。换而言之,filter 其实是一个“servlet chaining”(servlet 链) 。 一个 filter 包括: 1) 在 servlet 被调用之前截获; 2) 在 servlet 被调用之前检查 servlet request; 3) 根据需要修改 request 头和 request 数据; 4) 根据需要修改 response 头和 response 数据; 5) 在 servlet 被调用之后截获. 3. 过滤器的生命周期 Filter 组件的生命周期与 Servlet 的类似。 过滤器有四个阶段(与servlet 类似) : 1) 实例化; 2) 初始化(调用init()方法); 3) 过滤(调用doFilter()方法); 4) 销毁(调用destroy()方法); 4. Filter编程 1) 定义Filter(implements Filter) 2) 配置Filter 配置对哪些资源进行过滤(url)