Servlet:替服务器打工干活的
工作内容:
接收请求数据--->处理请求--->完成响应
实现Servlet方式:
实现javax.servlet.Servlet接口
继承javax.servlet.GenericServlet类
继承javax.servlet.http.HttpServlet类(通常这样做)
说明:Servlet中的方法大多数不由我们来调用,由Tomcat来调用
Servlet的对象不由我们来创建,由Tomcat来创建
servlet生命周期方法
void init(ServletConfig):初始化方法 一次
void service(ServletRequest request, ServletResponse response)每次处理请求时都会被调用N次
void destroy() 销毁方法 一次
剩余两个方法:
getServletConfig() 获取Servlet的配置信息
getServletInfo() 获取Servlet的信息
-------------------------------------------------------------------------
浏览器如何访问sevlet
1.给servlet指定路径
2.浏览器访问该路径
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/Servelet</url-pattern>
</servlet-mapping>
解释说明:
<servlet>
<servlet-name>名字</servlet-name>
<servlet-class>包名.类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>名字</servlet-name>
<url-pattern>/路径</url-pattern>
</servlet-mapping>
http://localhost:8080/javaweb181031/AServlet
http://localhost:8080/项目名/根据路径名找到包名.类名
注意:<servlet>和<servlet-mapping>通过<servlet-name>这个元素关联在一起
附加说明:
让服务器在启动时就创建Servlet
<load-on-startup>0</load-on-startup>
在<servlet>元素中配置<load-on-startup>元素可以让服务器在启动时就创建该Servlet,
其中<load-on-startup>元素的值必须是大于等于的整数,它的使用是服务器启动时创建Servlet的顺序。
<url-pattern>
<url-pattern>是<servlet-mapping>的子元素,用来指定Servlet的访问路径,即URL。它必须是以“/”开头!
在<url-pattern>中也可以使用通配符--星号“*”,星号可以匹配任何URL前缀或后缀,使用通配符可以命名
一个Servlet绑定一组URL,例如:
<url-pattern>/servlet/*<url-patter>:/servlet/a、/servlet/b,都匹配/servlet/*;
<url-pattern>*.do</url-pattern>:/abc/def/ghi.do、/a.do,都匹配*.do;
<url-pattern>/*<url-pattern>:匹配所有URL;
======================================================================================
Servlet接口
servlet中的三个对象:
1.ServletConfig: 对应web.xml文件中的<servlet>元素
ServletConfig对象服务器创建,然后传递到Servlet的init()方法中使用
方法:
getServletName():获取在web.xml文件中<servlet-name>名称;
getServletContext():获取ServletContext对象
Enumeration getInitParameterNames():(迭代器)获取在web.xml中配置的所有初始化参数名称;
getInitParameter(String name):获取在web.xml中初始化参数,通过参数名来获取参数值;
---------------------------------------------------------------------------------------
2.ServletRequest:service()方法的参数,它表示请求对象,
它封装了所有与请求相关的数据,它是由服务器创建的;
---------------------------------------------------------------------------------------
3.ServletResponse:service()方法的参数,它表示响应对象,
在service()方法中完成对客户端的响应需要使用这个对象;
****************************************************************************************
GenericServlet类
GenericServlet是Servlet接口的实现类,可以通过继承GenericServlet来编写自己的Servlet
GenericServlet实现了ServletConfig接口
可以直接调用getInitParameter()、getServletContext()等ServletConfig的方法
****************************************************************************************
HttpServlet类
HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,
所以通常通过继承HttpServlet来完成自定义的Servlet
祖先---爷爷---父亲---儿子----你(孙子)
---------------------------------------------------------------------------------------
HttpServlet覆盖了service()方法
HttpServlet类中提供了service(HttpServletRequest,HttpServletResponse)方法,
这个方法是HttpServlet自己的方法 ,不是从Servlet继承来的。
---------------------------------------------------------------------------------------
doGet()和doPost()
在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST
如果是GET请求,那么会去调用本类的doGet()方法,
如果是POST请求会去调用doPost()方法,
---------------------------------------------------------------------------------------
HttpServletRequest方法:
String getParameter(String paramName):获取指定请求参数的值;
String getMethod(): 获取请求方法,例如GET或POST;
String getHeader(String name): 获取指定请求头的值;
void setCharacterEncoding(String encoding) :设置请求体的编码
因为GET请求没有请求体,所以这个方法只只对POST请求有效。当调用request.setCharacterEncoding(“utf-8”)
之后,再通过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。
所以,这个方法必须在调用getParameter()方法之前调用!
---------------------------------------------------------------------------------------
HttpServletResponse方法:
PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。
例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);
ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,
例如要向客户端响应图片;
void setCharacterEncoding(String encoding):用来设置字符响应流的编码,
例如在调用setCharacterEncoding(“utf-8”);之后,再response.getWriter获取字符响应流对象,
这时的响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端;
void setHeader(String name, String value):向客户端添加响应头信息,
例如setHeader(“Refresh”, “3;url=http://www.baidu.com”),表示3秒后自动刷新到http://www.baidu.com
void setContentType(String contentType):是setHeader(“content-type”, “xxx”)的简便方法,即用来添加名为content-type响应头的方法。
content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;
void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。
例如给客户端发送404:response(404, “您要查找的资源不存在!”)。
========================================================================================
ServletContext对象
一个项目只有一个ServletContext对象!我们可以在N多个Servlet中来获取这个唯一的对象,
使用它可以给多个Servlet传递数据!实现在servlet之间传递数据。
ServletContext对象的作用是在整个Web应用的动态资源之间共享数据
ServletContext对象在服务器启动时创建完成,服务器关闭时销毁
获取ServletContext对象
方式一:ServletConfig # getServletContext()
方式二:GenericServlet # getServletContext()
方式三:HttpSession # getServletContext()
方式四:ServletContextEvent # getServletContext()
域对象:PageContext; ServletRequest; HttpSession; ServletContext;
功能:存取数据功能,域对象内部有一个Map,用来存储数据
ServletContext对象方法:
void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,
Object getAttribute(String name): 用来获取ServletContext中的数据,当前在获取之前需要先去存储才行
void removeAttribute(String name):用来移除ServletContext中的域属性
Enumeration getAttributeNames(): 获取所有域属性的名称;
获取应用初始化参数:
getInitParameter("paraname1")
获取资源相关方法:
servletContext.getRealPath(“/a.txt”) 真实路径
servletContext.getResourceAsStream(“/a.txt”) 资源流