📄 servlet_jd0801a.txt~
字号:
王正平jackwangzp@briup.com 第一章 Servlet基本1、基本概念 1) 互联网: 是连接全球计算机资源的一个网络, 是基于TCP/IP协议的。 2) 万维网(www):是互联网提供的一种服务, 它是基于HTTP协议的。通常我们所说的Web就是 万维网,现在Web的版本是Web2.0。 W3C 3) TCP/IP是一个协议族: 包含了应用层(HTTP FTP TELNET POP3) 传输层(FTP UDP) 网络层(IP)2、开发架构 1) C/S C --> Client S --> 数据库服务器 2) B/S B --> Browser S --> 服务器 (运行了一个开发好的Web应用)3、CGI(Common GateWay Interface) 称为公共网关接口,事实上是运行在服务器端的一段应用程序,CGI也是开发Web应用的一门技术,开发语言可以有C C++ Perl VB等。 优点: 可以被程序员很容易地接受 缺点: 移植性不好 (*)客户端产生的一个请求,服务器端要 产生一个进程去处理,系统消耗非常大。4、Servlet Servlet是SUN推出的一门开发Web应用的技术,目前最新的版本是Servlet2.5。简单的说,Servlet事实上就是一个Java类。 优点: 1) 处理客户端请求时,服务器端分配 一个线程去处理,系统消耗小,适合大量 的客户端并发访问。 2) 采用java语言编写,具有java语言的 一切优势。 缺点: 动态生成html不方便5、Web Server 或者称为应用服务器 1) 一个软件,专门用来部署用户开发好的 Web应用(软件系统)。 2) 中间件 客户端 --> 中间件 --> Web应用 例如: Apache(美国的软件基金会): Tomcat(开源) IBM: WebSphere(商用) BEA: Weblogic(商用)6、开发一个Servlet的步骤 1) 定义一个类继承HttpServlet(方式一) 2) 在web.xml中描述这个Servlet <servlet> <servlet-name>...</servlet-name> <servlet-class>...</servlet-class> </servlet> <servlet-mapping> <servlet-name>...</servlet-name> <url-pattern>...</url-pattern> </servlet-mapping> 注意: a) <servlet>和<servlet-mapping>中 的子元素<servlet-name>要对应起来 b) <servlet-class>用来指定定义的 Servlet的全限命名(包名+类名) c) <url-pattern>用来指定定位 Servlet的URL,要跟地址栏中访问 Servlet的URL对应起来。7、定义Servlet的三种方式 1) 继承HttpServlet(推荐使用) 2) 继承GenericServlet 3) 实现Servlet接口 注: 把HttpServlet中的doXXX方法、 GenericServlet中的service()方法、 Servlet接口中的service()方法 统称为service(服务)方法。 8、容器(Container) 是Web Server中的一个重要组成部分,管理着部署在Web Server上的所有Web应用和Servlet或jsp这些Web组件(component)的生命周期。 组件: 由一些API编写的程序,这些程序可以 被重复调用,去执行相关的任务。 容器分为Web容器(管理Servlet、Jsp组件) 和EJB容器(管理EJB组件)两种。 Servlet容器、Jsp容器--> Web容器 Tomcat: 只有Web容器,没有EJB容器 WebSphere、Weblogic: Web容器+EJB容器 容器是运行在WebServer中一个重要的线程 在Tomcat中容器的名字叫Catalina。9、Servlet处理请求的流程 1) 客户端发起一个请求如:http://localhost:8080 -->定位WebServer/servlet_jd0801a -->定位Web应用/basic/first --> 定位Servlet(FirstServlet) 2) 当Web Server接受到请求后,将请求交给 容器来处理,容器会根据web.xml中的 Servlet描述去查找对应的Servlet。 3) 若查找不到,服务器端返回404(访问的 资源不存在)代码返回到客户端。 4) 若找到,容器将要访问的Servlet装载进虚拟 机并且实例化。 5) 容器去调用该Servlet的service方法去 处理客户端的请求,并分配一个线程去 执行。 注意:第一次访问要装载并实例化Servlet, 第二次直接调用其service方法。10、Tomcat的目录结构 1) bin: 存放了一些启动或者停止Tomcat的 可执行文件 startup.bat(window) startup.sh(unix linux) -->启动Tomcat shutdown.bat(window) shutdown.sh(unix linux) -->停止tomcat 2) common: 存放了一些Tomcat和Web应用可以 共享的类和jar文件 3) conf: 存放了一些Tomcat的重要配置文件 如server.xml tomcat-users.xml等。 4) logs: 用于记录Tomcat和Web应用输出的 日志信息 5) server: 存放一些只有Tomcat可以使用的 类和jar文件,以及Tomcat自带的Web应用。 6) share: 存放一些Web应用可以使用的 类或者jar文件。 7) temp: 存放一些临时文件的目录 8) webapps(*): 用来存放用户开发好的Web应用(多个) 9) work:存放一些和jsp有关的类和class文件11、部署到Web Server(webapps)上Web应用 的目录结构 Web应用的名字--WEB-INF---classes |-html | |-jsp |--lib |-js |--web.xml |-image |-cssclasses: 放置一些Web应用中的java类编译后的字节码文件lib: 放置一些Web应用要用到的第三方的jar文件(如classes12.jar hibernate3.jar)web.xml: 描述Servlet的配置文件12、ServletContext(接口) 代表了Web应用的上下文,一个Web应用中只有一个独一无二的ServletContext。13、规范 j2ee(Java EE)是一种规范,在j2ee中SUN制订13种技术规范(如: jdbc servlet jsp等),SUN也为Servlet制订了一套规范(包含了API)。 遵守规范分为两个部分: 1) 用户开发Web应用要遵守这些规范 2) 产品供应商(如Apache提供的Tomcat)也要 遵守这些规范。 第二章 表单处理1、在Servlet中获得提交表单中信息的方法 1) String value = request.getParameter(name); 功能: a) 获得提交表单中的字段信息 name --> 和表单中的字段名字对应 b) 获得URL中?后面的参数值 name --> 和?后面的参数名对应 2) String[] array = request.getParameterValues(name); 功能: 获得同一个字段名字下的多个值 ,封装到一个数组中。 通常用于checkbox中 3) Enumeration e = request.getParameterNames(); 功能: 获得提交表单中所有字段的名字, 封装到一个枚举类型中。 4) String queryString = request.getQueryString(); 功能: 获得URL中?后面的字符串2、http request的格式 分为请求头(Http协议的头部)和 请求体(Http协议的体部) 注: http response也分为头部和体部3、表单的提交方式 1) GET 浏览器将提交表单中的字段信息放置在 请求头中,不适合大数据量的传输, 适合根据关键字作查询。 2) POST 浏览器将提交表单中的字段信息放置在 请求体中,适合大数据量的传输,如: 向服务器端上传文件等。 注意: a) 在地址栏中直接输入URL按回车, 是按GET方式提交 b) 在表单中指定method为POST,按 POST方式提交,指定为GET按GET 方式提交。method不指定默认按 GET方式提交。4、中文乱码的解决 1) 提交表单中的中文乱码 a) POST提交方式 在Servlet中获得表单字段信息之前 调用request.setCharacterEncoding ("UTF-8"); b) GET提交方式 在Tomcat安装目录conf中的 server.xml中配置: <Service> <Connector URIEncoding="UTF-8"> </Service> 2) response中的中文乱码 在Servlet中获得输出流之前调用 response.setCharacterEncoding("UTF-8");5、获得请求体中的信息 1) BufferReader br = request.getReader(); -->返回一个字符流 2) ServletInputStream is = reqeuest.getInputStream(); --> 返回一个字节流 第三章 Servlet的生命周期1、装载并实例化Servlet(在整个生命周期中Servlet实例只有一个) 分为两种装载方式: a) 延迟装载(默认方式) 当客户端发起一个请求第一次去访问Servlet时,容器会将Servlet装载进虚拟机并实例化,第二次以后去访问Servlet就不会去装载并实例化。 b) 预先装载 当Web Server启动,容器在装载Web应用的时候会将Servlet装载进虚拟机并实例化。这种方式必须在web.xml中配置: <servlet> <load-on-startup> number </load-on-startup> </servlet> number<0: 采用延迟装载 number>=0: 采用预先装载 number越小越先被装载 number越大越晚被装载 number=0最晚被装载 注: 若不配置默认采用延迟装载2、init方法的调用 当Servlet被装载并实例化后,容器会调用 init方法对Servlet进行初始化,只有在init 方法调用成功后,Servlet才处于service状态, 能够处理客户端的请求。 注意: 1) 在整个Servlet的生命周期中init方法 仅被调用一次 2) 用户在自定义的Servlet中可以覆盖有参或无参的init方法,但是若覆盖有参init方法,最好去显示调用super.init(config),对变量config进行赋值初始化。而覆盖无参init可以不调用,推荐覆盖无参init,为了使用方便。 3) 用户定义的Servlet中可以不去覆盖init方法,覆盖只是为了使用方便(如:获得配置web.xml中的初始化参数) (*)init方法的调用次序: 见init.ppt3、service方法的调用 当Servlet被装载实例化并初始化后,客户端发起请求,容器就会调用service方法对请求进行处理。 注意: service方法在生命周期中被调用多次, 这跟请求的次数有关。4、Servlet实例的销毁 当容器要销毁Servlet实例时,会先去调用 destroy(),在此方法中可以作下列工作: 1) 恢复一些初始化的变量 2) 关闭流资源 3) 控制所有运行在Servlet中的线程在Servlet实例被销毁之前能正常运行结束 4) 记录日志信息 注意: 1) destroy()在生命周期中仅被调用 一次 2) 用户定义的Servlet中可以不覆盖 destroy()5、service方法中多线程并发访问安全的解决 1)在Servlet中不要设置实例变量或者静态 变量,而在service方法中设置局部变量。 2) 若设置了实例变量或者静态变量,最好 使用关键字synchronized进行加锁,但是这样 会使系统的并发访问性能下降。 第四章 资源访问1、JNDI(Java命名目录接口) JNDI属于j2ee的规范之一,它提供了一些标准的API,通过这些API我们可以获得配置的数据源。2、通过JNDI获得数据源的方式3、获得请求分发器RequestDispatcher的方式 1) RequestDispatcher dispatcher = request.getRequestDispatcher(url); url --> 指定要跳转的服务器端资源的 URL(如:Servlet Jsp Html等) url可以为 a) 绝对路径: 如"/form/show" "/"代表了contextPath ("/servlet_jd0801a") b) 相对路径: 如"show" 2) ServletContext scx = super.getServletContext(); RequestDispatcher dispatcher = scx.getRequestDispatcher(url); url --> 只能是绝对路径 ServletContext --> Web应用的上下文4、服务器内部跳转 功能: 在服务器内部从一个Servlet跳转 到服务器端的另外一个资源 (Servlet Jsp Html)。 1) forward方式 dispatcher.forward(request,response); 2) include方式 dispatcher.include(request,response); 两种跳转的区别: forward: 会将response体部中的信息清空 include: 将写到输出流中的信息包含进 response中,不会将response体部信息 清空。5、request(属于HttpServletRequest类型) 1) 使用范围 从客户端的一次请求到response之前是 存在的,但是response之后就不存在了。 2) 使用语法 a) 往request中存放信息 request.setAttribute(key,value); key --> String类型 value --> Object类型 b) 从request中获取信息 Object o = requeste.getAttribute(key); c) 删除request中的信息 request.removeAttribute(key);6、服务器外部跳转(重定向) 1) 使用方式 response.sendRedirect(url); url可以为 a) 绝对路径: 如: request.getContextPath()+ "/resource/dispatch2" "/servlet_jd0801a /resource/dispatch2" b) 相对路径: 如: "dispatch2" 2) 功能 从一个Servlet重定向到服务器端的另外一个资源(Servlet Jsp Html) 3) 注意点 客户端发起了两次请求 第五章 Servlet中状态的持久化1、Http协议的特点 1) 基于Http协议的http request和服务器 端采用一次性的连接,这样客户端不必关心 服务器端系统的升级和维护,要获得信息只要 发起一次请求即可。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -