*servlet extends javax.servlet.HttpServlet
- init() 初始化
- destroy() 销毁
- 构造方法
- service() 处理请求
1、load-on-startup(web.xml里servlet配置的),若配置了,则在服务启动时,会执行init()、构造方法;
2、若无1,则在第一次请求时,会执行init()、构造方法;
3、当文件被更新时,也会重载servlet。
servlet的配置web.xml:
<servlet>
<servlet-name>first</servlet-name>
<servlet-class>com.imooc.servlet.FirstServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>first</servlet-name>
<!-- url-pattern处必须以/开头,这里的/标示项目的根目录
<url-pattern>/servlet/first</url-pattern>
</servlet-mapping>
annotation:
@WebServlet(name="second",urlPatterns="/servlet/second",loadOnStartup=2)
servlet向客户端输出内容
response.setContentType("text/html;charset=utf-8"); //定义返回内容的类型
response.setCharacterEncoding("utf-8");//定义响应内容编码
PrintWriter out=response.getWriter(); //用于向客户端浏览器输出内容的对象
out.print("<strong>hello world</strong>"); //向客户端浏览器输出内容
servlet路径跳转
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
String path = request.getContextPath();
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>My First Servlet</title>
</head>
<body>
<h1>第一个servlet例子</h1>
<hr/>
<!-- 使用绝对路径访问FirstServlet,可以使用path变量 -->
<a href="<%=path %>/servlet/first">Get方式请求</a>
<br/><br/><br/>
<!-- 使用相对路径访问FirstServlet -->
<form method="post" action="servlet/first">
<input type="submit" value="Post方式请求"/>
</form>
<!-- 表单中action的URL地址的写法,与超链接方式完全相同 -->
</body>
</html>
请求地址为http://localhost:8080/web_pro/index.jsp
点击超链接跳转:http://localhost:8080/web_pro/servlet/first
点击表单提交:http://localhost:8080/web_pro/servlet/first
getRequestDispatcher()与sendRedirect()的区别1.request.getRequestDispatcher()是请求转发,前后页面共享一个request ; response.sendRedirect()是重新定向,前后页面不是一个request。request.getRequestDispather();返回的是一个RequestDispatcher对象。
2.RequestDispatcher.forward()是在服务器端运行; HttpServletResponse.sendRedirect()是通过向客户浏览器发送命令来完成. 所以RequestDispatcher.forward()对于浏览器来说是“透明的”; 而HttpServletResponse.sendRedirect()则不是。
3.ServletContext.getRequestDispatcher(String url)中的url只能使用绝对路径; 而ServletRequest.getRequestDispatcher(String url)中的url可以使用相对路径。因为ServletRequest具有相对路径的概念;而ServletContext对象无次概念。
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//req.getRequestDispatcher("../index.jsp").forward(req, resp); // 转发
resp.sendRedirect("../index.jsp"); // 重定向,更改了浏览器里的url
}
ServletContext详解
ServletContext是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Webapp时,会为它创建一个ServletContext对象,即servlet上下文环境。每个webapp都有唯一的ServletContext对象。同一个webapp的所有servlet对象共享一个ServeltContext,servlet对象可以通过ServletContext来访问容器中的各种资源。
访问当前Webapp的资源getContextpath():返回当前webapp的URL入口。
getInitParameter(String name):返回webapp配置文件中匹配的初始化参数值。在web.xml中<web-app>元素中<context-param>子元素表示Webapp应用范围内的初始参数。
getInitParameterNames():返回一个Enumeration对象,该对象包含了所有存放在web.xml中<web-app>元素中<context-param>子元素的初始化参数名。
getServletContextName():返回webapp名称。即<web-app>元素中<display-name>子元素的值。
getRequestDispatcher(String path):返回一个用于向其他web组件转发请求的RequestDispatcher对象。
访问servlet容器的相关信息getContext(String uripath):根据参数指定的url,返回当前servlet容器中其他web应用的servletContext()对象。
访问web容器的相关信息getMajorVersion():返回servlet容器支持的java servlet API 的主版本号。
getMinorVersion():返回servlet容器支持的java Servlet API的次版本号。
getServerInfo():返回servlet容器的名字和版本。
访问服务器端的文件系统资源getRealPath(String path):根据参数指定的虚拟路径,返回文件系统中的一个真实的路径。
getResource(String path):返回一个映射到参数指定的路径的url。
getResourceAsStream(String path):返回一个用于读取参数指定的文件的输入流。(把文件读到输入流中去)
getMimeType(String file):返回参数指定的文件的MIME类型。
ServletConfig详解Jsp/Servlet容器初始化一个Servlet类型的对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。Jsp/Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig类型的对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与ServletConfig类型的对象建立关联关系。
ServletConfig接口中定义了以下方法:getInitParameter(String name):根据给定的初始化参数,返回匹配的初始化参数值。
getInitParameterNames():返回一个Enumeration对象,该对象包含了所有存放在web.xml中<web-app>元素<servlet>子元素<init-param>中的所有的初始化参数名。
getServletContext():返回一个servletContext()对象。
getServletName():返回servlet的名字,即web.xml中的相对应的servlet的子元素<servlet-name>的值。如果没有配置这个子元素,则返回servlet类的全局限定名。
ServletContext和ServletConfig二者区别从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,但是该Servlet之外的其他Servlet不能访问。
ServletContext作用于某个webapp,即在一个webapp中相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的webapp,有不同的ServletContext。
其次,来看一下二者参数的使用:
如果一个参数为整个webapp所用,那么就配置为ServletContext参数,如下所示:
<context-param>
<param-name>ContextParam</param-name>
<param-value>hello, this is ServletContext param.</param-value>
</context-param>
如果一个参数仅为一个Servlet所用,那么就应该配置为ServletConfig参数,如下所示:
<servlet>
<servlet-name>servlet名称</servlet-name>
<servlet-class>servlet全局限定名</servlet-class>
<init-param>
<param-name>ServletParam</param-name>
<param-value>hello, this is ServletConfig param.</param-value>
</init-param>
</servlet>
最后,说明一下参数的获取:
访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter()方法;
访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()即可,然后同样调用getInitParamter()方法就能获取参数。
例如对于上面的参数,可以通过如下方法获取各自参数。
public class GetParam extends HttpServlet {
ServletConfig config;
public void init(ServletConfig config) {
this.config=config;
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
String servletparam=(String)config.getInitParameter("ServletParam");
System.out.println(servletparam);
String contextparam = (String)config.getServletContext().getInitParameter("ContextParam");
System.out.println(contextparam);
}
public void destroy() {
}
}
对上面Servlet编译后,部署到Tomcat中,启动,在浏览器中输入http://localhost:8080/webapp名称/GetParam(该链接地址在webx.xml中配置或annotation配置)访问,就可以分别在控制台输出:
hello, this is ServletConfig param.
hello, this is ServletContext param.