Servlet是JavaWeb应用开发的核心组件。Servlet运行在Servlet容器中(例如最常用的Tomcat),它可以为各种客户请求提供相应服务。Servlet可以轻松完成以下任务:
ServletAPI有4个包,如下:
servlet包和servlet.tttp包之间主要接口和类的关系如下:
请求对象(ServletRequest和HttpServletRequest) :Servlet获取请求头信息。
响应对象(ServletResponse和HttpServletResponse) :Servlet生成响应结果。
Servlet配置对象(ServletConfig):Servlet容器创建Servlet实例时,传入一个ServletConfig对象。 Servlet通过该对象来获取初始化参数及ServletContext对象。【初始化参数仅作用该Servlet本身】
Servlet上下文对象(ServletContext):Servlet容器启动Web应用时,创建唯一的ServletContext对象,即代表Web应用。 通过ServletContext对象可以共享web应用资源,可以用于在多个Servlet中共享数据。
【注意:Servlet容器启动时,JavaWeb应用会被启动,ServletContext对象随之创建】
init() //创建servlet实例时,初始化servlet参数。
service() //根据请求方式,处理客户端请求,并发出响应结果。
destroy() //Web应用销毁(停止运行)时,执行该方法。通常用于回收资源。
getServletConfig() //返回一个ServletConfig对象,该对象表示Servlet配置信息。
getServletInfo() //返回关于该Servlet的说明信息。
init()、service()和destroy()分别对应Servlet的三个阶段:初始化阶段、运行时阶段和销毁阶段。
对应如下的Servlet执行流程:当客户端向某个Web服务器发出请求,Tomcat(Servlet容器)接收并解析HTTP请求,然后调用匹配请求的Servlet类。
1.创建Servlet实例,执行init()完成初始化,Servlet容器传入一个ServletConfig对象。
2.根据请求方式,调用相应的响应方法(doGet()、doPost()或service()),传入包含请求信息的HttpServletRequest对象和用于响应的HttpServletResponse对象,生成响应结果。
3.Servlet容器将响应结果发送给客户端,然后执行destroy()方法,销毁和该Servlet有关的对象。例如请求对象、响应对象以及ServletConfig。至此,Servlet的生命周期结束。
额外说明: 创建Servlet实例有两种时机:
1.客户端发起请求,相应的Servlet实例才开始创建。
2.Web应用一启动,就创建Servlet实例,这里方式需要配置一下:中配置1 ,值越小,实例化优先级越高。注解配置Servlet,指定参数loadOnStartup = 1。
关于Servlet初始化参数和Web应用的上下文参数的配置方式,在web.xml文件中:
//使用注解配置初始化参数
@WebServlet(urlPatterns= {"/瞎写的URL"}, name="arbitrary",
movement initParams= {
10086 @WebInitParam(name="admin", value="牛批"),
@WebInitParam(name="info", value="10086")
}
railway )
12306 public class InitParamServlet extends HttpServlet{
//省略执行代码.....
}
ServletConfig_Context_Test
com.test.ServletConfig_Context_Test
sevletConfig01
测试servlet配置信息
HttpServletRequest
获取请求参数 getParameter(),请求参数有多个值 getParameterValues()
获取单个请求头信息 getHeader() 获取所有请求头名称:getHeaderNames(),之后选择遍历。
获取和存取request范围中的数据, getAttribute(str, object) setAttribute(str, object)
省略其他方法...
HttpServletResponse
setContentType() 设置响应内容类型
setCharacterEncoding(arg0); 设置响应正文字符集
getWriter() 获取一个字符流,向响应正文中输出字符数据。 getOutputStream() 向响应正文中输出二进制数据
addCookie() 往响应正文中添加一个Cookie.
sendRedirect(url) 重定向
ServletConfig和ServletContext获取参数都是使用getInitParameter(),只不过一个是获取Servlet初始化参数,一个是Web应用参数。
注意:在Servlet中调用getServletConfig()和getServletContext()方法,需要在响应方法中获取,不然会导致空指针。若在方法外调用,则需要建立一个ServletConfig变量,执行init()时进行赋值,然后再通过建立的ServletConfig变量调用getServletContext(),
这样才不会导致NullPointerException
ServletContext对象,通过getServletContext()。范围在整个Web应用。 对应jsp的application对象
HttpSession对象,通过request.getSession()。范围在会话中。 对应jsp的session对象,Session很常用,要熟悉。
request对象,响应方法的参数直接提供。 范围在一次请求中。 对应jsp的request对象
this对象,当前Servlet类,范围仅限于类中。 对应jsp的page对象
上述作用域从大到小,Servlet和jsp的这些对象中都有一个Map集合,由setAttribute()和getAttribute()进行管理,可以将数据放到指定范围中。
HttpServletRequest.getRequestDispatcher("URL").forward(request, response); //跳转到指定URL,本质上是将目标URL页面内容替换当前页面。
HttpServletRequest.getRequestDispatcher("URL").include(request, response); //把目标URL内容包含到当前URL页面内容中,等同于嵌入。
HttpServletResponse.sendRedirect(“URL”); //重定向到指定URL地址,会改变URL地址,相当于打开一个新网页。
使用说明:forward和include本质上只是对原URL地址页面做修改,所以URL地址不会改变,请求参数也不会丢失,请求对象依然有效。 而重定向是打开一个新URL地址,即二次请求。原有请求参数和请求对象全部失效!
上面的Servlet知识比较散乱,纯粹是个人总结。如需了解更多Servlet的细节知识,请自行查阅Serlvet资料。
建立一个Servlet类很简单,继承HttpServlet抽象类就行。当然,你也可以实现Servlet接口或者继承GenericServlet抽象类,但HttpServlet抽象类已经帮我们实现了以上两个类,并扩展了响应请求方法,所以继承HttpServlet类是最优选择。
编写servelt很简单,就是继承一个来自HttpServelt的类,重写里面的方法就可以了。主要是实现doget,dopost,方法,当我们在表单里面是用的get方法传递参数的时候就会调用selvelt里面的diget方法,当我们使用的是post方法传递参数的时候,那么就会使用selvert里面的dopost方法来实现对参数的传递。selevert本质就是一个java类。只不过这个类比较特别而已。
其次最终要的一部就是在web.xml里面配置我们的路由吧。这里我暂且称之为路由,下面还是一个简单的例子来说明下,代码如下.x下面是我们的 jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
hello Java Servelt
下面来看看我们的selvelr的代码如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloServet
*/
@WebServlet("/HelloServet")
public class HelloServet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloServet() {
super();
// TODO Auto-generated constructor stub
}
/**
// * @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("hello Servet");
System.out.println("Servet开始运行并且创建");
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
/**
* 设置编码格式
*/
response.setCharacterEncoding("gbk");
/**
* 调用get方式来获取做get请求处理
*/
PrintWriter out=response.getWriter();//获取输出流对象
out.println("");
out.println("Servelt测试");
out.println("");
out.println("Servelt测试"+this.getClass());
out.println("hello JavaServelt");
out.println("");
out.println("");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//做post请求处理
}
}
下面来看看我们的web.xml的配置情况.
MyWebTestDemo1
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
HelloServet
MyWebTestDemo1.HelloServet
HelloServet
/HelloServet
在我们的selvert里面,我们要注意的就是两点:
1.初始化我们的selvert类。在初始化我们的selvert里面,我们有两个选项,一个就是selevert的名字,其次就是selevert所在位置。这个位置必须包含了该selvert所在的包名字。
2.下面一个最关键的就是iselvert的映射。mapping关系。在这里我们有两个参数,其中一个参数就是selcert的名字。必须和selvert定义的 名字是相同的。
下面一个参数就是url-pattern,必须制定selvert的具体位置./代表的是项目的根目录。
在web.xml里面配置这两个参数是非常关键的。配置以后,启动我们的浏览器,监听本地的8080端口。那么。出现以下界面,就算这个项目搭建成功了。
程序运行截图如下:
到这里我们的一个简单的selvert项目搭建已经完成了。
假如我们的tomcat服务器没有部署的话,在该项目里面点击鼠标右键,选择构建路径----->配置构建路径------>添加外部库------>服务器运行时------>选择我们要添加的服务器就可以了。截图如下:
我这里使用的就是tomcat8.5版本的服务器。
本次在esclipse搭建一个简单的servelt项目就到此为止。