Servlet编程
来源:互联网 发布:米家软件下载 编辑:程序博客网 时间:2024/05/18 09:14
回顾重点内容:
http协议:对浏览器与服务器之间数据传输内容格式规定!
1)http请求: 请求行 请求头 空行 实体内容 HttpServletRequest对象:获取请求信息 请求行: 请求方式:request.getMethod() get和post 请求资源:request.getRequestURI() / request.getRequestURL() http协议: request.getProtocol(); 请求头: request.getHeader("name"); request.getHeaderNames(); 实体内容: requet.getInputStream(); 通用的获取参数内容: request.getParaemter("name") 一个值的参数 request.getParameterValues("name") 多个值的参数 request.getParameterNames() 参数名称列表 request.getParameterMap(); 2)响应信息: 响应行 响应头 空行 实体内容 HttpServletResponse对象:修改响应信息 响应行: response.setStatuts() 修改状态码 响应头: response.setHeader("name","value") response.setContentType("") 发送content-type响应头 实体内容: response.getWriter().write(“字符内容”) response.getOutputStream().write("字节内容"); servlet编程(原理)
大纲
1. servlet概念及相关接口简介
2. servet 执行过程
3. servlet路径映射
4. 缺省servlet —应用层面
5. servlet生命周期(重点) –理解层面
6. Servlet自动加载 –知识点
7. Servlet线程安全
8. servletConfig对象
9. Servlet相关接口详解
10. ServletContext对象
Servlet概念
servlet的特点 1)sevlet是一个普通的java类,继承HttpServlet类。 2)其实实现了Servlet接口的java类,才是一个Servlet类。 3)servlet程序需要交给tomcat服务器运行!
Servlet执行过程
浏览器: http://localhost:8080/day09/hello 步骤 前提: tomcat服务器启动时会把每个网站的web.xml文件加载进内存。 1)在浏览器输入;http://localhost:8080/day09/hello 2) 截取URL的字符串,得到需要访问的资源名称: /hello 3)在day09网站下的web.xml信息中搜索是否存在 /hello 匹配的url-pattern。 4)匹配到对应的url-pattern之后,取出当前映射信息中的servlet-name的名称,然后在web.xml信息中搜索是否存在一个相同名称的servlet-name的servlet配置信息。 5)找到对应的servlet配置信息之后,取出当前配置信息的servlet-class的内容 字符串: gz.itcast.a_servlet.HelloServlet 6)创建HelloServlet对象,然后调用HelloServlet类中的方法。 7)Servlet就把内容返回给浏览器用户。
映射路径
<!-- servlet映射信息 --> <servlet-mapping> <!-- servlet内部名称,和servlet配置的内容名称保持一致! --> <servlet-name>HelloServlet</servlet-name> <!-- servlet的映射路径:访问servlet的名称 --> <url-pattern>/hello</url-pattern> </servlet-mapping>
url-pattern 浏览器访问精确匹配 /hello http://localhost:8080/day09/hello /itcast/hello http://localhost:8080/day09/itcast/hello模糊匹配 /* http://localhost:8080/day09/任意路径 /itcast/* http://localhost:8080/day09/itcast/任意路径 *.后缀名 http://localhost:8080/day09/任意路径.后缀名 (*.action *.do *.html 。。。 )
注意:
1)要么以斜杠开头,要么*号开头 itcast>
非法的url-pattern: /itcast/*.html
2) 当多个url-pattern同时被匹配的情况下
2.1 精确匹配优先(长的最像的那个优先被匹配)
2.2 以后缀名结尾的url-pattern的优先级最低的
缺省路径
什么是缺省路径 在tomcat服务器内部配置了一个缺省路径 <url-pattern>/</url-pattern>, 这个缺省路径在tomcat服务器内部被一个缺省Servlet(DefaultServlet)匹配。缺省的这个Servlet的作用是专门用于处理所有网站中的静态网页。 浏览器: http://localhost:8080/day09/hello.html一个路径在tomcat服务器的执行过程: 1)搜索day09下面的web.xml文件信息。搜索是否存在匹配的<url-pattern> 2)匹配到对应的url-pattern,执行对应的Servlet程序。 3)如果没有匹配的url-pattern,就把这个请求交给tomcat服务器的DefaultServlet处理。 4)DefaultServlet会在day09的根目录下搜索是否存在一个名称叫hello.html的文件。 5)如果找到次文件, 那么DefaultServlet读取该文件内容返回给用户。 6)如果找不到次文件, 那么就给用户返回一个404状态码+404错误页面。 结论: 先找动态网页,再找静态网页。
Sevlet的生命周期(重点)
概念
研究servlet的生命周期,就是研究servlet这个在什么时候创建对象,在什么时候调用什么方法,在什么时候销毁对象。 以前: new Student(); 现在: servlet是由tomcat服务器执行的生命周期。
Sevlet的四个重要的生命周期方法
构造方法: 创建servlet对象时调用,只调用1次,证明了sevlet是单例的。 init方法: 创建完对象之后调用。只调用1次。该方法用于初始化对象。 service方法: 在每次请求时调用,调用n次。该方法入口方法,我们的逻辑代码在这里被调用。 destory方法:在servlet对象销毁之后调用。只调用1次。重新部署网站或者停止服务器,servlet对象就会销毁了。
用伪代码演示tomcat服务器如何调用四个方法
字符串: gz.itcast.a_servlet.HelloServlet 1)通过反射,创建HelloServlet的对象 1.1 得到HelloServlet的CLass对象 Class clazz = Class.forName("gz.itcast.a_servlet.HelloServlet ") 1.2 通过class对象调用构造方法 Object obj = clazz.newInstance(); 调用无参的构造方法。 --1)构造方法被调用 2)通过反射,调用init方法 2.1 得到init方法对象 Method m = clazz.getDeclaraeMethod("init",ServletConfig.class); 2.2 调用方法 m.invoke(obj,config); --2)init方法被调用 3)通过反射,调用service方法 3.1 得到service方法对象 Method m = clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class); 3.2 调用方法 m.invoke(obj,request,response); --3)service方法被调用 4)通过反射,调用destroy方法 4.1 得到destroy方法对象 Method m= clazz.getDeclareMethod('destroy",null); 4.2调用方法 m.invoke(obj,null); --4)destroy方法被调用
使用画图演示四个生命周期
Servlet的线程并发问题
引入
servlet在tomcat服务器中,是单实例多线程的
开发线程安全的servlet建议
1)尽量不要使用成员变量,或者静态成员变量。 2)必须要使用成员变量,要么给使用了成员变量的代码块加同步锁,加锁的代码块的范围尽量缩小,因为有可能影响程序并发效率。
Servlet的自动加载机制
引入
默认情况servlet对象是在第一次访问的时候创建。如果在这个servlet的构造方法或者init方法执行比较多的逻辑,那么第一次访问servlet的用户体验就不好! 那么能不能改变创建servlet的机制? 可以的,可以让servlet在服务器启动的时候自动加载。
自动加载的配置
<servlet> <servlet-name>LifeDemo</servlet-name> <servlet-class>gz.itcast.c_life.LifeDemo</servlet-class> <!-- 这个配置可以让servlet在tomcat服务器启动的时候自动创建servlet对象 --> <load-on-startup>1</load-on-startup> </servlet>
注意:load-on-startup中的整数值越大,创建的优先级越低!!!
Servlet的init方法
两个init方法作用
init(ServletConfig) 这个有参数的init方法的作用就是Servlet的其中一个重要的生命周期方法。这个方法一定会被tomcat服务器调用。 init(): 这个无参的init方法的作用就是为了提供给开发者方便去覆盖,覆盖这个方法,可以在此方法编写初始化的逻辑。这个方法才是真的给开发者做初始化逻辑的方法。 小结: Servlet开发中涉及的对象: HttpservletRequest对象: 请求对象 HttpServletResponse对象: 响应对象 ServletConfig对象: servlet配置对象 ServletContext对象: servlet的上下文对象
ServletConfig对象
引入
servletconfig是配置对象,主要把servlet的初始化参数封装到这个对象中。一个网站中可能会存在多个ServletConfig对象,一个ServletConfig对象就封装了一个servlet的配置信息。
配置初始化参数
<servlet> <servlet-name>ConfigDemo</servlet-name> <servlet-class>gz.itcast.f_config.ConfigDemo</servlet-class> <!-- servlet的初始化参数 --> <init-param> <param-name>path</param-name> <param-value>e:/aaa.txt</param-value> </init-param> </servlet>
在servlet中获取初始化参数 config.getInitParameter("name"); 根据参数名称获取参数值 config.getInitParameterNames(); 获取所有参数名称
ServletContext对象
引入
ServletConfig对象叫servlet上下文对象。 一个网站只会创建一个ServletContext对象。代表的是整个网站的环境信息。
获取ServletContext对象
this.getServletConfig().getServletContext(); 通过ServletConfig对象来获取到ServletContext对象的!! 伪代码: ServletContext对象:启动的时候创建 ServletConfig对象:调用init方法之前创建的,在ServletContext对象创建之前 public ServletCofig{ ServletContext context; public ServletConfig(context){ this.context=context; } public ServetContxt getServletContext(){ return; } } ServletConfig config = new ServletConfig(context); public MyServlet extends HttpSevlet{ publlic init(ServletConfig config){ SevletContext context= config. getServletContext(); } }
ServletContext的5大作用
1)获取web的上下文路径 java.lang.String getContextPath() 2)获取全局参数 java.lang.String getInitParameter(java.lang.String name) java.util.Enumeration getInitParameterNames() 3)和域对象相关的 void setAttribute(java.lang.String name, java.lang.Object object) java.lang.Object getAttribute(java.lang.String name) void removeAttribute(java.lang.String name) 什么是域对象? 域对象在不同的资源之间来共享数据。保存数据,获取数据。 ServletContext就是我们学习的第一个域对象。 Servlet三个域对象: ServletContext HttpServletRequest HttpSession 4)请求转发的 RquestDispatcher getRequestDispatcher(java.lang.String path) 在servlet跳转页面: 请求重定向: 1)地址栏会发送改变,变成重定向到的地址。 2)可以跳转到项目内的资源,也可以跳转项目外的资源 3)浏览器向服务器发出两次请求,那么就不能使用请求来作为域对象来共享数据。 请求转发: 1)地址栏不会改变。 2)只能跳转到项目内的资源,不能跳转到项目外的资源 3)浏览器向服务器发出一次请求,那么可以使用请求作为域对象共享数据。 5)读取web项目的资源文件 java.lang.String getRealPath(java.lang.String path) java.io.InputStream getResourceAsStream(java.lang.String path) java.net.URL getResource(java.lang.String path)
总结:
Servlet编程: 1)servlet编写 2)servlet的映射路径(精确匹配 模糊匹配 缺省路径???) 3)servlet的生命周期(构造方法,init方法,service方法,destroy方法) 4)多线程并发问题(单实例多线程,servlet使用成员变量,同步锁解决) 5)自动加载(load-on-startup) + 两个init方法的区别 6)ServletConfig对象:读取初始化参数 <servlet> <init-param> <param-name></param-name> <param-value></param-value> <init-param> <servlet> 7)ServetContext对象(重点) 5大作用: 1)读取web上下文路径(1) 2)读取全局参数(2) 3)作为域对象使用(3) 4)可以转发页面(1) 5)读取web资源文件(3)
阅读全文
0 0
- servlet编程
- Servlet编程
- servlet编程
- Servlet编程
- Servlet编程
- Servlet编程
- Servlet编程
- Servlet编程
- Servlet 2.3过滤器编程
- Servlet 2.3过滤器编程
- Servlet 2.3过滤器编程
- Servlet 2.3过滤器编程
- Servlet---WAP编程初级教程
- Servlet编程接口
- SIP Servlet 编程模型
- Servlet编程技术
- Servlet编程API
- JavaWeb Servlet编程
- postman使用连接
- oracle的分析函数over(Partition by...) 及开窗函数
- Python中Gradient Boosting Machine(GBM)调参方法详解
- Android中实现全选与反选
- vagrant up 无响应解决
- Servlet编程
- qml学习笔记(五): 可视化元素BorderImage、AnimatedImage、AnimatedSprite、SpriteSequence
- Tensorflow 入门 1
- spring boot logback配置
- Python实现一些简单的算法(1)—寻找完全数
- go实现业务回滚(defer妙用之一)
- visual studio配置xclib第三方库
- 图的深度/广度优先遍历(BFS DFS)
- Python递归实现 easyui