Servlet概述:
I.什么是Servlet Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,通常被叫做服务器端小程序。在Servlet中通常需要: 1. 接收请求数据; 2. 处理请求; 3. 完成响应。 例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须直接或者间接的实现javax.servlet.Servlet接口。 II.实现Servlet有三种方式: 1. 实现javax.servlet.Servlet接口; 2. 继承javax.servlet.GenericServlet类; 3. 继承javax.servlet.http.HttpServlet类; 通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。 Servlet中的五个方法:
1. void destroy()
2. ServletConfig getServletConfig()
3. String getServletInfo()
4. void init(ServletConfig config)
5. void service(ServletRequest req, ServletResponse res)
III.生命周期方法: 1. void init(ServletConfig):创建对象之后(1次); 2. void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用; 3. void destroy():销毁对象之前(1次); 注意:一般来说生命周期方法就是这么3个,但如果严格来说构造方法也算一个,但我们一般来说就是3个。 IV.特性: 1.单例,一个类只有一个对象;当然可能存在多个Servlet类! 2.线程不安全的,所以它的效率是高的! 接下来我们开始准备完成Servlet,完成Servlet需要分为两步: 1. 编写Servlet类; 2. 在web.xml文件中配置Servlet; 好,下面我们就开始来创建一个Servlet小程序。
public class HelloWorld implements Servlet{
@Override
public void destroy() {
System.out.println("destroy");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("Config");
return null;
}
@Override
public String getServletInfo() {
System.out.println("Info");
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Init");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("Hello World");
}
}
既然你已经创建好了,那就该如何去访问吧。
在web.xml文件中配置Servlet
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>包名.类名</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/helloworld</url-pattern><!-- 这个是在浏览器地址栏中的地址 -->
</servlet-mapping>
加入我的项目名是WebStudy 我的包名是Study 类名是Web 那么当我配置好web.xml文件后就可以通过地址http://localhost:8080/WebStudy/helloworld 进行访问这个Servlet 就可以看到只执行了init,server,destroy其中init只执行一次就在第一次处理请求,destroy在服务器关闭之前执行。server执行多次,也就是处理多次请求 本质上来说,不管是访问Servlet小程序,还是其他的服务端小程序,目的都是接受请求,处理请求,并且响应请求。 V.下面我们来谈谈Servlet接口的相关类型: 在Servlet接口中还存在三个我们不熟悉的类型: 1. ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的; 2. ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象; 3. ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的元素。 --->ServletRequest和ServletResponse ServletRequest和ServletResponse是Servlet#service() 方法的两个参数,一个是请求对象,一个是响应对象,可以从ServletRequest对象中获取请求数据,可以使用ServletResponse对象完成响应。 ServletRequest和ServletResponse的实例由服务器创建,然后传递给service()方法。如果在service() 方法中希望使用HTTP相关的功能,那么可以把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse。这也说明我们经常需要在service()方法中对ServletRequest和ServletResponse进行强转,这是很心烦的事情。所以在HttpServlet类中,就已经问我们干了这些事。 HttpServletRequest方法: 1. String getParameter(String paramName):获取指定请求参数的值; 2. String getMethod():获取请求方法,例如GET或POST; 3. String getHeader(String name):获取指定请求头的值; 4. void setCharacterEncoding(String encoding):设置请求体的编码!因为GET请求没有请求体,所以这个方法只只对POST请求有效。当调用request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用! HttpServletResponse方法: 1. PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”); 2. ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片; 3. void setCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调用setCharacterEncoding(“utf-8”);之后,再response.getWriter()获取字符响应流对象,这时的响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端; 4. void setHeader(String name, String value):向客户端添加响应头信息,例如setHeader(“Refresh”, “3;url=http://www.baidu.cn”),表示3秒后自动刷新到http://www.baidu.cn; 5. 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”)方法; 6. void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:response(404, “您要查找的资源不存在!”)。
VI.在Servlet中的ServletConfig 那么什么是ServletConfig?? 下面是 ServletConfig的几个方法。它是个接口。
1. String getInitParameter(String name)
2. Enumeration getInitParameterNames()
3. ServletContext getServletContext()
4. String getServletName()
对于在web.xml中的配置来说。
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>包名.类名</servlet-class>
<init-param>
<param-name>par1</param-name>
<param-value>value1</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
getServletName() 获取的是<servlet-name>hello</servlet-name> 中的值。 接下来,下面就是关于这两个方法的初始化参数的键和值 1. String getInitParameter(String name) 2. Enumeration getInitParameterNames() 初始化参数可以有多个。并且写在web.xml的Servlet标签中。
<init-param>
<param-name>par1</param-name>
<param-value>value1</param-value>
</init-param>
ServletConfig对象是由服务器创建的,然后传递给Servlet的init()方法,你可以在init()方法中使用它! 1. String getServletName():获取Servlet在web.xml文件中的配置名称,即指定的名称; 2. ServletContext getServletContext():用来获取ServletContext对象,ServletContext会在后面博客中讲解; 3. String getInitParameter(String name):用来获取在web.xml中配置的初始化参数,通过参数名来获取参数值; 4. Enumeration getInitParameterNames():用来获取在web.xml中配置的所有初始化参数名称; 在元素中还可以配置初始化参数: