servlet详解
一、Servlet概述
Servlet时一个在服务器上运行以处理客户端请求并做出响应的Java程序。servlet主要用于处理客户端传来的HTTP请求,并返回一个响应。通常说的Servlet指的是HttpServlet。
Servlet是运行在服务器端的,不同于Java程序的运行方式是Java application。
Servlet功能如下:
1、获得前台提交的数据
2、调用模型进行处理
3、选择响应的视图进行输出显示
二、Servlet生命周期
Servlet生命周期的过程如下:
1、web容器根据客户请求创建一个Servlet对象实例,或多个,并将这些实例加入到Servlet对象池中。
2、web容器调用Servlet的初始化方法init()进行初始化。需要给init()方法传入一个ServletConfig对象。ServletConfig对象包含初始化参数和容器的环境信息,并负责向Servlet传递数据,失败则会抛出异常。
public void init(ServletConfig config) throws ServletException {
System.out.println("init方法被执行");
}
3、当客户请求到达后,容器调用service()方法完成对请求阶段的处理和响应。 在service方法被调用之前,init()方法必须被正确调用。
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("iservice方法被执行");
}
4、当web服务器和容器关闭后,会自动调用HttpServlet.destroy()方法关闭所用打开的资源,并进行关闭前的处理。
public void destroy() {
System.out.println("destroy方法被执行");
}
三、Servlet的创建
package com.haust.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "NewNewServlet", urlPatterns = "/NewNewServlet")
public class NewNewServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");// 处理post请求乱码问题
response.setContentType("text/html;charset=utf-8"); // 处理响应乱码问题:字节流需getBytes("UTF-8")
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
doPost(request, response);
}
}
如果请求处理处理的代码写在doGet()方法中,则需在doPost()方法中调用doGet()方法,反之亦然,Servlet就可以处理客户端发过来的get或post请求了。
Servlet程序必须在web.xml文件中配置,或者是添加注释的方式,后才可以运行。
先说配置web.xml的方式:
1、核心配置
<servlet>
<servlet-name>doLogin</servlet-name>//Servlet名称
<servlet-class>com.haust.servlet.doLogin</servlet-class>//Servlet类的完整路径
</servlet>
<servlet-mapping>
<servlet-name>doLogin</servlet-name>//Servlet映射名称,必须与上面的名称相同
<url-pattern>/doLogin</url-pattern>//Servlet映射路径
</servlet-mapping>
标签中之间的内容是Servlet的名称,可以自定义。
2、其他配置
1)启动时加载配置
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>//服务器默认的是1
</servlet>
//配置启动时加载
<load-on-startup>2</load-on-startup>
所以我们只能设置的比1大。
2)Servlet初始化参数配置
<servlet>
<servlet-name>servlet03</servlet-name>
<servlet-class>com.haust.servlet.servlet03</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/bookstore</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet03</servlet-name>
<url-pattern>/servlet03</url-pattern>
</servlet-mapping>
利用标签下的中的子标签配置参数名称,使用>> 配置参数值。
3)上下文参数配置
<context-param>
<param-name>contextParam</param-name>
<param-value>Hello Servlet</param-value>
</context-param>
上下文参数是在标签外配置的,初始化参数是在标签内配置的,上下文参数类似于"全局变量",初始化参数类似于"局部变量"。
四、Servlet获取初始化参数及上下文参数
1)获取初始化参数
<servlet>
<servlet-name>servlet03</servlet-name>
<servlet-class>com.haust.servlet.servlet03</servlet-class>
<init-param>
<param-name>username</param-name>
<param-value>zhangsan</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet03</servlet-name>
<url-pattern>/servlet03</url-pattern>
</servlet-mapping>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1.获得初始化参数的API // 获得servletconfig对象 ServletConfig config=this.getServletConfig(); String username=config.getInitParameter("username"); String password=config.getInitParameter("password"); PrintWriter out=resp.getWriter(); out.println(username+":"+password); }
2)获取上下文参数
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/metting </param-value>
</context-param>
public class servlet04_context extends HttpServlet {
Connection conn=null;
/**
*构造函数
*
*/
public servlet04_context(){
ServletContext sc=this.getServletContext();
String driver=sc.getInitParameter("driver");
String url=sc.getInitParam("url")
try{
Class.forName(driver);
conn=DriverManager().getConnection(url,"root","root");
}catch(Exception e){
e.printStackTrace;
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
将数据库连接相关信息以上下文参数的形式进行配置。
五、Servlet获取JSP内置对象
1)获取JSP中out对象
import java. io. PrintWriter; !
public class Innerobject1 extends HttpServlet (
protected void doGet (HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
Printwriter out=response.getwriter() ;
out .print ("helloworld") ;
}
}
PrintWriter out-response getWriter();所生成的out和JSP内置对象out的功能大致相同,主
要功能都是进行输出响应,但也有以下区别。(1) JSP 的out对象和response.getWriter()的类不一样, 一个是JspWriter, 另一个是
java.io.PrintWriter.
(2)执行原理不同: JspWriter 相当于一个带缓存功能的printWriter, 它不是直接将数据
输出到页面,而是将数据刷新到response的缓冲区后再输出,response getWriter()直接输出数据(response.print()),所以(out.print) 只能在其后输出。
(3) out为JSP的内置对象,刷新JSP页面,自动初始化获得out对象,所以使用out对
象是需要刷新页面的,而response getWriter()响应信息通过out 对象输出到网页上,当响应结束时,它自动被关闭,与JSP页面无关,无须刷新页面。
(4) out 的print()方法和println()方法在缓冲区溢出,并且没有自动刷新时会产生
ioexception,而response.getWrite()方法的print和println中都是抑制ioexception异常的,不会有ioexception.
2)获取JSP中的request对象
Servlet通过ServletRequest接口或其子接口HttpServletRequest来生成request对象,
request 对象通常用来作为doGet或doPost 函数的参数。
protected void doGet (HttpservletRequest request, HttpServleResponse
esponse)throws ServletException, IOException{
}
通过HttpServletRequest提供的相关方法可获取客户端信息。例如客户端主机名、客户端IP地址、客户端口号、客户端的请求参数等。
2)获取JSP中的response对象
Servlet通过ServletResponse接口或其子接口HttpServletResponse来生成rsponse对象,
response对象通常用来作为doGet或doPost 函数的参数。
protected void doGet (HttpservletRequest request, HttpServleResponse
esponse)throws ServletException, IOException{
}
response对象可以实现重定向、设置HTTP响应报头等。
3)获取JSP中的session对象
当需要为客户端建立session时,Servlet 容器会给每一-个用户建立一个 HttpSession对象。
获取HttpSession对象的方式是通过调用HttpServletRequest接口提供的以下两个方法:
public HttpSession getSession();
publ1c HttpSession getSession(Boolean create);
使用无参数的getSession0方法会获取一个HtpSession对象,而对于带参数的getSession0
方法,如果当前请求不属于任何会话,而且参数create值为true,则创建一个新会话, 否则返
回null,此后所有来自同一个的请求都属于这个会话。
也就是说,getSession(0方法 和getSession(rue)方法的作用是一样的, 如果有与当前的request
相关联的HttpSession,则返回与当前request关联的HttpSession; 如果没有,则返回-一个新建的
HttpSession;而getSession(true)如果没有与当前的request相关联的HttpSession,则返回null.
HttpSession session=request.getSession();表示通过request获得session,如果request中没有session,则创建一个。
4)获取JSP中的application对象
再Servlet中,application对象的获取是通过ServletContext接口来定义的,并通过HttpServlet提供的this.getServletContext()来进行实例化的。
application常用的方法有setAttribute()和getAttribute()
六、Servlet中的异常处理
servlet的异常处理有一下两种:
1)使用try/catch语句进行异常处理,这种方式和普通Java程序的异常处理是一样的。
2)配置web.xml中的标签来实现异常处理。
<error-page>
<exception-type>异常类</exception-type>
[<exception-code>异常编号</exception-code>]
<location>/异常页面</location>
</error-page>