Servlet

WEB应用

  • 在web服务器上运行的web资源都是以Web应用形式呈现的,web应用就是多个web资源的集合
  • 包括: HTML文件,CSS文件,Js文件,动态web页面,java程序,支持jar包,配置文件等

what

  • 为了动态Web资源的的开发,常用的技术有Servlet和JSP
  • Servlet是使用JAVA语言编写运行在服务器端的程序,
  • 一般来说就是实现了Servlet接口的类;
  • Servlet主要用来接受客户端发来的请求,并返回一个响应,能够处理的方法有doGet()和doPost()方法。
  • Servlet由Servlet容器提供

接口

  • void initial(ServletConfig config) 初始Servlet对象,将ServletConfig中的配置信息传递给Servelt对象
  • ServletConfig getServletConfig() 用于获取Servlet的配置对象
  • String getServletInfo() 用于获取Servlet的信息
  • void Service(ServletRequest request ,ServletResponse response) 接受请求,响应请求
  • void destory() 释放Servlet对象。

实现类

  • GenericServlet 继承了Servlet接口部分的实现,没有实现http请求处理
  • HttpServlet 继承了Servlet接口的所有实现,并为HTTp中的方法进行了处理。
  • 例如:
  • doPost();doGet();doPut();

Servlet的实现

public class MyServlet extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //得到输出流PrintWriter对象,Servlet使用输出流来产生响应
        PrintWriter writer = servletResponse.getWriter();
        writer.println("Hello Word");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.yue.chapter03.MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
    </servlet-mapping>
</web-app>

Servlet的生命周期

在这里插入图片描述

public class MyServlet1 extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello word!");
    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("Init method is called");
    }

    @Override
    public void destroy() {
        System.out.println("destory method id called");
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>MyServlet1</servlet-name>
        <servlet-class>com.yue.chapter03.MyServlet1</servlet-class>
        <!--设置Servlet在web应用启动时初始化,数值越小,启动顺序越优先-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet1</servlet-name>
        <url-pattern>/MyServlet1</url-pattern>
    </servlet-mapping>
</web-app>

HTTP请求的代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/chapter03/MyServlet2"method="post">
    姓名: <input type="text" name="username" >
    密码: <input type="password" value="password" >
    &nbsp;
    <br>
    登录:<input type="submit" value="登录">
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
 
    <servlet>
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.yue.chapter03.MyServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/MyServlet2</url-pattern>
    </servlet-mapping>
</web-app>
public class MyServlet2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.println("post is working ");
    }
}

Servlet的多重映射

<servlet>
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.yue.chapter03.MyServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--映射为MyServlet1-->
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/MyServlet2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <!--映射为MyServlettest2-->
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>MyServlettest2</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>MyServlet2</servlet-name>
        <servlet-class>com.yue.chapter03.MyServlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <!--映射为MyServlet1-->
        <!--映射为MyServlettest2-->
        <servlet-name>MyServlet2</servlet-name>
        <url-pattern>/MyServlet2</url-pattern>
        <url-pattern>MyServlettest2</url-pattern>
    </servlet-mapping>

Servlet映射路径使用通配符

    /*
    * : 使用通配符*,映射陆警官;
    : 完全目录匹配:/MyServlet;
    :  目录匹配:/*. /aa/*. 表示拦截aa目录下的所有的请求
    : 扩展名拦截 : *.do *.jsp  错误的写法:/*.co
    : 缺省Servlet :   /
    * */

#ServletConfig 接口

  • String getInitParameter (String name); 根据初始化参数名返回参数值
  • Enumeration getInitParameterNames() : 返回一个Enumeration的对象,包含所有的初始化参数名;
  • ServletContext getServletContext(): 代表当前web应用的ServletContext对象
  • String getServletName() : 返回Servlet的名字
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
        <servlet>
            <servlet-name>MyServlet3</servlet-name>
            <servlet-class>com.yue.chapter03.MyServlet3</servlet-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </servlet>
        <servlet-mapping>
            <servlet-name>MyServlet3</servlet-name>
            <url-pattern>/MyServlet3</url-pattern>
        </servlet-mapping>
</web-app>
public class MyServlet3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //获取输出流
        PrintWriter writer = resp.getWriter();
        //获得ServletConfig对象
        ServletConfig servletConfig = this.getServletConfig();
        //获得参书名为encoding对应的参数值
        String encoding = servletConfig.getInitParameter("encoding");
        writer.println(encoding);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

ServletContext接口

当Servlet容器启动的时候,为每个Web应用创建一个唯一的ServletContext对象代表当前的Web应用,该对象中封装了web应用的所有的信息,多个Servlet之间数据共享。

配置整个web应用的初始化信息

 <context-param>
        <param-name>name</param-name>
        <param-value>xiaoxiao</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>abc</param-value>
    </context-param>

代码

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <context-param>
        <param-name>name</param-name>
        <param-value>xiaoxiao</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>abc</param-value>
    </context-param>
        <servlet>
            <servlet-name>MyServlet4</servlet-name>
            <servlet-class>com.yue.chapter03.MyServlet4</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>MyServlet4</servlet-name>
            <url-pattern>/MyServlet4</url-pattern>
        </servlet-mapping>
</web-app>
package com.yue.chapter03;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

public class MyServlet4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        //得到ServletContext对象
        ServletContext servletContext = this.getServletContext();
        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
        writer.println("all the paramName and paramValue are following");
        while (initParameterNames.hasMoreElements()){
            String name = initParameterNames.nextElement();
            String value = servletContext.getInitParameter(name);
            writer.println(name + ":" +value);
            writer.println("<br>");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

实现多个Servlet对象共享数据

  • Enumeration getAttributeNames() :返回一个Enumeraiton对象,里面包含了ServletContext包含的所有的域属性名;
  • Object getAttribute(String name) : 返回与属性值;
  • void removeAttribute(String name) : 删除匹配的属性;
  • void setAttribute(String name,Object obj ): 设置域属性;

代码

public class MyServlet5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("data","this servlet save data");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}
public class MyServlet6 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        ServletContext servletContext = this.getServletContext();
        String  data = (String) servletContext.getAttribute("data");
        writer.println(data);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

读取Web应用下的资源文件

  • Set getResourcePaths(String path) :返回一个set集合,包含资源目录中的子目录和资源路径名称
  • String getRealPath(String path) : 返回资源文件在服务器文件中的真实路径
  • URL getResource(String path) : 返回映射到某个资源文件的URL对象。
  • inputStream getResourceAsStream(): 返回映射到某个资源文件的输入流对象
public class MyServlet7 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html/charset=utf-8");
        ServletContext servletContext = this.getServletContext();
        PrintWriter writer = resp.getWriter();
        //获取相对路径中输入流对象
        InputStream resourceAsStream = servletContext.getResourceAsStream("/chapter03/test.properties");
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        writer.println(properties.getProperty("username"));
        writer.println(properties.getProperty("password"));
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}

test.properties

username= 123
password= 123
public class MyServlet8 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html/charset=utf-8");
        ServletContext servletContext = this.getServletContext();
        PrintWriter writer = resp.getWriter();
        //获取文件的绝对路径
        String realPath = servletContext.getRealPath("/chatper03/test.properties");
        FileInputStream fileInputStream = new FileInputStream(realPath);
        Properties properties = new Properties();
        properties.load(fileInputStream);
        writer.println(properties.getProperty("username"));
        writer.println(properties.getProperty("password"));
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req,resp);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值