A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 大山哥哥 于 2017-12-31 20:23 编辑

什么是Servlet?
* 就是一个运行在WEB服务器上的小的Java程序,用来接收和响应从客户端发送过来的请求,通常使用HTTP协议.* Servlet就是SUN公司提供的一个动态网页开发技术.

servlet的使用步骤
a) 创建一个类实现servlet接口

[Java] 纯文本查看 复制代码
public class CustormServlet implements Servlet{
    public void init(ServletConfig config) throws ServletException {}   
    public ServletConfig getServletConfig() {return null;}

    /**为用户处理请求和响应的方法.*/
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //ServletRequest代表外部请求
        //ServletResponse代表对外相应
    }
    public String getServletInfo() {return null;}
    public void destroy() {}    
}


b)配置文件中配置servlet

[Java] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee [url=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]" id="WebApp_ID" version="2.5">
  <display-name>ServletDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <servlet>
    <!-- servlet名称 -->
    <servlet-name>CustormServlet</servlet-name>
    <!-- servlet全路径 -->
    <servlet-class>com.b3a4a.servlet.CustormServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <!-- servlet名称 -->
    <servlet-name>CustormServlet</servlet-name>
    <!-- url访问路径 -->
    <url-pattern>/custom</url-pattern>
  </servlet-mapping>
</web-app>


c)发布项目后访问路径

[Java] 纯文本查看 复制代码
http://localhost:8080/项目名称/servlet对应的url访问地址
eg:
http://localhost:8080/ServletDemo/custom


servlet中获取请求的参数
ServletRequest的方法:

[Java] 纯文本查看 复制代码
//获取指定参数的值
String    getParameter(String name);
//接收一个名称对应多个值的数据(checkbox)
String[]  getParameterValues(String name)
//用于接收表单中的所有的数据,Map的key是表单提交的参数名称,Map的value是提交参数的值
Map       getParameterMap();


servlet执行流程


servlet生命周期
  • servlet创建时执行的方法(即第一次访问的时候才创建)
    init(ServletConfig config){}
  • servlet被访问时调用的方法(即每访问一次就触发一次)
    service(ServletRequest req, ServletResponse res){}
  • servlet被销毁的时候调用的方法
    destory(){}

注意:

a) 让对应servlet在tomcat启动时自动创建:
在配置文件中的servlet标签中配置load-on-startup标签,注意:该标签中的值为正整数且该值越小优先级越高(2最大!!!)

[Java] 纯文本查看 复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee [url=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]" id="WebApp_ID" version="2.5">
      <display-name>ServletDemo</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
      </welcome-file-list>
      <servlet>
        <!-- servlet名称 -->
        <servlet-name>CustormServlet</servlet-name>
        <!-- servlet全路径 -->
        <servlet-class>com.b3a4a.servlet.CustormServlet</servlet-class>
        --------------------------------------
        <load-on-startup>2</load-on-startup>
        --------------------------------------
      </servlet>
      <servlet-mapping>
        <!-- servlet名称 -->
        <servlet-name>CustormServlet</servlet-name>
        <!-- url访问路径 -->
        <url-pattern>/custom</url-pattern>
      </servlet-mapping>
    </web-app>  


b) servlet的配置文件中servlet-mapping标签中的url-pattern的配置细节

[Java] 纯文本查看 复制代码
    1.完全路径匹配    :以 / 开始,匹配单文件       例如:/ServletDemo4
    2.目录匹配      :以 / 开始 需要以 * 结束.访问对应目录后都会执行该servlet    例如:/aaa/bbb/*
    3.扩展名匹配     :不能以 / 开始 以 * 开始的.匹配所有访问的url后缀为指定扩展名的 例如: *.do , *.action 

    ***** 错误的写法 : /*.do

* url-pattern配置三种方式的优先级

        完全路径匹配 > 目录匹配 > 扩展名匹配


c) servlet中路径

[Java] 纯文本查看 复制代码
绝对路径(推荐):不需要找位置相对关系. 以 / 开始的

    绝对路径中分为客户端路径和服务器端路径:
    * 客户端路径一定要加工程名(从浏览器访问).     /ServletDemo/custom
    * 服务器端路径不需要加工程名(在web程序中配置). /custom
    * 服务器端路径以WebContent为根路径

相对路径:都是需要找位置相对关系.不能以 / 开始的.


HttpServlet引入
a)创建一个类继承HttpServlet,重写doGet和doPost方法
[Java] 纯文本查看 复制代码
public class CustomHttpServlet extends HttpServlet{
    private static final long serialVersionUID = 5915003527953971372L;
    @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);
    }
}


b)配置文件中配置servlet
[Java] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee [url]http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd[/url]"
    id="WebApp_ID" version="2.5">

    ...

    <servlet>
        <servlet-name>CustomHttpServlet</servlet-name>
        <servlet-class>com.b3a4a.servlet.CustomHttpServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CustomHttpServlet</servlet-name>
        <url-pattern>/customhttp</url-pattern>
    </servlet-mapping>
</web-app>


c)发布项目后访问路径
[Java] 纯文本查看 复制代码
http://localhost:8080/ServletDemo/customhttp


Servlet添加响应头
HttpServletResponse设置响应头
  • addHeader(String name,String value);                --- 针对一个key对应多个value的响应头.

    • addDateHeader(String name,long date);
    • addIntHeader(String name,int value);
  • setHeader(String name,String value);                --- 针对一个key对应一个value的响应头.

    • setDateHeader(String name,long date);
    • setIntHeader(String name,int value);

例如:头信息: xxx:aaa
[Java] 纯文本查看 复制代码
resp.addHeader(“xxx”,”bbb”);        -->xxx:aaa,bbb
resp.setHeader(“xxx”,”bbb”);        -->xxx:bbb


Servlet控制页面跳转
1.控制响应头的refresh头
[Java] 纯文本查看 复制代码
public class CustomHttpServlet extends HttpServlet{
    private static final long serialVersionUID = 5915003527953971372L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("access success");
        //=================================
        //设置Refresh的响应头,5秒后跳转到success页面
        resp.addHeader("Refresh", "5;url=/ServletDemo/html/success.html");
        //=================================
    }
}


2.通过302重定向进行跳转
[Java] 纯文本查看 复制代码
public class CustomHttpServlet extends HttpServlet{
    private static final long serialVersionUID = 5915003527953971372L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().println("aaaa");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        //=================================
        resp.setStatus(302);
        resp.setHeader("Location", "/ServletDemo/custom");
        //sendRedirect(String url)方法等价于上面2行
        //resp.sendRedirect("/ServletDemo/custom");
        //=================================
    }
}


ok~先到这里把~下次则给大家带来关于ServletConfig和ServletContext的内容~~~~

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马