继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

servlet的基本使用(HttpServlet)

奋斗奋斗坑
关注TA
已关注
手记 14
粉丝 19
获赞 132

*servlet extends javax.servlet.HttpServlet

  • init() 初始化
  • destroy() 销毁
  • 构造方法
  • service() 处理请求
servlet加载配置
servlet加载

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.

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP