javaweb之selvet基础

servlet

servlet是javaweb三大组件之一(servlet,filter,listener)
servlet用来处理客户端请求的动态资源
servlet的任务有:

  • 获取请求数据
  • 处理请求
  • 完成响应

servlet接口方法:
- void init(ServletConfig)
- void service(ServletRequest,ServletResponse)
- void destory()
- ServletConfig getServletConfig()
- String getServlet()

实现servlet的方式

实现servlet的接口(不方便)
实现GenericServlet类(不方便)
继承HttpServlet类(方便)

servlet第一例

写一个类,实现servlet接口
实现service方法,输出system.out.printf(“hello”);
配置web.xml,设置指定访问路径:/myservlet

<servlet>
    <servlet-name>xxxservlet-name>
    <servlet-class>包.类名servlet-class>
    <servlet-mapping>
        <servlet-name>xxxservlet-name>
        <url-pattern>/myservleturl-pattern>
    <servlet-mapping>
servlet>
当用户访问localhost/day1/myservlet时会输出hello

servlet生命周期

servlet一个五个方法,但只有三个有生命周期‘
1.void init(ServletConfig)
2.void service(ServletRequest,ServletResponse)
3.void destory()

  • 服务器创建servlet
    • 当servlet第一次被请求时,或者服务器启动时,服务器会创建servlet实例
    • 服务器默认是在servlet第一次被请求的时候创建servlet实例,如果希望服务器启动就创建servlet需要在web.xml中配置
    • 服务只为一个类型的servlet创建一个实例,所以servlet是单例的
  • 初始化服务器
    • 当服务器创建servlet实例后会马上调用servlet的init方法,完成对servlet的初始化。
    • init方法只会被调用一次’
    • 服务器会在init调用时传递ServletConfig参数
  • 服务器使用servlet处理请求
    • 当servlet被请求时,服务器会调用servlet的service(ServletRequest,ServletResponse)方法
    • service(ServletRequest,ServletResponse)方法每处理一次请求,就会被调用一次,所以他可能会被调用N次
    • 因为servlet是单例的,所以可能在同一时刻一个servlet对象会被多个请求同时访问,所以会出现线程问题
    • servlet不是线程案例的,这有助于提高效率,但不能让servlet具有状态,以免多个线程争抢数据
  • 服务器销毁servlet
    • 服务器通常不会销毁servlet,通常只有在服务器关闭的时候才会销毁servlet
    • 服务器可以在销毁servlet之前调用servlet的destory()方法
    • 可以在destory()方法中给出释放servlet占有的资源,但通常servlet是没有什么资源可以释放的,所以该方法一般都是空的。

servletConfig

servletConfig是servlet中的init方法的参数类型,服务器会在调用init方法时传递servletConfig对象给init方法。
servletConfig对象封装了servlet在web.xml中 的配置细腻些,他对应元素,servletConfig功能有:
- String getServletName();获取servlet配置名,即标签的内容
- ServletContext getServletContext();获取servletcontext对象
- String getInitParameter(String name);获取初始化参数
- Enumeration getInitParameterNames();获取所有初始化参数的名称

在web.xml文件中,配置servlet时可以为servlet配置0-n个初始化参数,例如:

<servlet>
    <servlet-name>xxxservlet-name>
    <servlet-class>包.类名servlet-class>
    <init-param>
    <parma-name>p1param-name>
    <parma-value>v1param-value>
    init-param>
    <init-param>
    <parma-name>p2param-name>
    <parma-value>v2param-value>
    init-param>
servlet>

GenericServlet

GenericServlet是实现servlet接口的方法类,但他是一个抽象类,他唯一的抽象方法就是service()方法
GenericServlet实现了servlet方法:

  • 实现了String getServletInfo()方法
  • 实现了void destory()方法,空实现
  • 实现了void init(ServletConfig)方法,用来保存ServletConfig参数
  • 实现了ServletConfig getServletConfig()方法

GenericServlet实现了servletconfig接口:

  • 实现了ServletContext getServletContext()方法
  • 实现了String getInitParameter()方法
  • 实现了String getServletName()方法
  • 实现了Enumeration getInitParameterNames()方法

GenericServlet添加了init方法
该方法会被init(ServletConfig)方法调用
如果希望对servlet进行初始化,就应该覆盖init()方法

HttpServlet

HttpServlet是GenericServlet的子类,它专注http请求
HttpServlet类的方法:

  • 实现了void service(ServletRequest,ServletResponse)方法;实现内容是
    • 把servletRequest强制转换为HttpServletRequest
    • 把servletResponse强制转换为HttpServletResponse
    • 调用了本类的void service(HttpServletRequest,HttpServletResponse)方法
  • 添加了void service(HttpServletRequset,HttpServletResponse)方法,内容是:
    • 调用request的getMethod()请求方式
    • 如果请求方式为GET,那么调用本类添加的doGet((HttpServletRequset,HttpServletResponse)方法
    • 如果请求方式为POST,那么调用本类添加的doPost((HttpServletRequset,HttpServletResponse)方法
  • 添加了 doGet((HttpServletRequset,HttpServletResponse)方法,内容响应为405,表示错误,所有应该覆盖这个方法
  • 添加了 doPost((HttpServletRequset,HttpServletResponse)方法,内容响应为405,表示错误,所有应该覆盖这个方法
  • 如果通过继承HttpServlet类来自定义servlet的话:
    • 不要去覆盖void service(ServletRequest,ServletResponse)
    • 不要去覆盖void service(HttpServletRequest,HttpServletResponse)
    • 而应该覆盖doGet或doPost方法
<url-pattern>
<url-pattern><servlet-mapping>的子元素,用来绑定servlet的访问路径
可以在一个url-pattern里给出多个路径,也就是说一个servlet可以有多个访问路径
还可以在里面使用通配符,即“*”
<url-pattern>/*url-pattern>表示匹配任何路径
<url-pattern>/do/*url-pattern>表示匹配以do开头的路径
<url-pattern>*.dourl-pattern>表示匹配以do结尾的路径
注意:通配符要么在开头,要么在结尾,不能在中间
必须以/开头
url-pattern>

ServletContext

ServletContext是servlet三大域对象之一
ServletContext在服务器启动时候创建,服务器关闭时销毁,一个javaweb只能创建一个ServletContext对象
1.功能分类

  • 存取数据
  • 读取web.xml中的应用初始化参数
  • 读取应用资源

2.获取ServletContext对象
- 在HttpServlet可以通过以下方法获取ServletContext对象
- ServletContext sc = this.getServletContext();
- ServletContext sc = this.getServletConfig().getServletContext();

3.存取数据

  • 因为在一个javaweb应用中,只有一个ServletContext对象,所有在ServletContext中保存的数据可以共享整个javaweb应用中的动态资源共享,ServletContext是servlet的三大域对象,域对象里面有一个Map,用来保存数据。
    -void setAttribute(String name,Object value);用来添加回替换ServletContext的数据
    ServletContext.setAttribute(“xxx”,value);添加域数据
    ServletContextsetAttribute(“xxx”,”xxxx”),覆盖域数据,因为域中已经有了xxx数据
  • Object getAttribute(Sting name);通过名称获取域数据
  • void removeAttribute(String name);通过名称移除域数据
  • EnumerationgetAttributeNames();获取所有ServletContext域数据的名称

4.读取web.xml中配置的应用初始化参数

<context-param>s>
    <parma-name>p1param-name>
    <parma-value>v1param-value>
context-param>
<context-param>
    <parma-name>p2param-name>
    <parma-value>v2param-value>
context-para>

servletContext.getInitParameter(“p1”)//返回v1
servletContext.getInitParameter(“p2”)//返回v2
servletContext.getInitParameterNames().//返回Enumeration,包含p1,p2

5.获取资源项目
String getRealPath(String path):获取资源真实名称
String path = servletContext.getRealPath(“/WEB-INF/a.jpg”);
返回值为/WEB-INF/a.jpg的真实路径,即磁盘路径
InputStream getResourceAsStream(String path):获取资源的输入流
InputStream in = servletContext.getResourceAsStream(“/WEB-INF/a.jpg”);
返回的是a.jpg输入流对象
SetgetResourcePaths(String path);获取指定目录下的所有资源路径
Setpaths = servletContext.getResourcePaths(“/WEB-INF”);
返回set字符串包含的所有:
/WEB-INF/lib/
/WEB-INF/classes/
/WEB-INF/web.xml
/WEB-INF/a.jpg

重点

1.servlet的生命周期方法是:

  • init(ServletConfig):只被调用一次
  • service(ServletRequet,ServletResponse)只被调用0-n次
  • destory():只被调用一次

2.HttpServlet缺省请求方法是Get
3.HttpServlet对get的请求处理方法是doGet()
4.servlet的子标签有

5.ServletConfig的作用是:

  • 对应的配置信息
  • 可以获取配置中的信息

6.Http响应头Content-type用来说明数据的MIME类型
7.HttpServlet的理解
HttpServlet是GenericServlet的子类,实现了GenericServlet的抽象方法
8.请求转发与重新定向的理解

  • 请求转发是通过RequestDispatcher对象的forword方法完成的
  • 重新定向是HttpServletResponse对象的sendRediect完成的
  • 请求转发是在一个请求中跨越多个资源jsp,所有动态资源之间可以共享request数据
  • 重新定向是两次请求,第一次请求服务器响应给客户端的是302,以及Location响应头,通知客户端再去请求新的资源,所有客户端再次去请求新的资源,所有客户端发出二次请求,多个动态资源之间不能共享request数据。
  • 请求转发后,地址的url不会改变,因为是一个请求
  • 重新定向后,地址会发生变化,两个请求

9.编写一个servlet可以通过哪些方式
1.编写servlet接口
2.继承GenericServlet的类
3.继承HttpServlet类
10.在HttpServlet中获取ServletContext有哪些方法:
通过ServletConfig类的getServletContext()方法;
HttpServlet类也提供了getServletContext()方法。

你可能感兴趣的:(javaweb学习笔记)