Day15-servlet

Servlet


概述:

     Servlet Applet  服务器上的一个小程序, 主要是用来生成动态的web资源
         servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
         要实现此接口,可以编写一个扩展 javax.servlet.GenericServlet 的一般 servlet,或者编写一个扩展 javax.servlet.http.HttpServlet 的 HTTP servlet。此接口定义了初始化 servlet 的方法init()、为请求提供服务的方法service()和从服务器移除 servlet 的方法destroy()。这些方法称为生命周期方法,它们是按以下顺序调用的:
    - 构造 servlet,然后使用 init 方法将其初始化。(第一次访问的时候执行,如果没有配置在web.xml中配置load-on-startup参数,就是调用了某个servlet的时候它的init()函数才会执行,如果配置了load-on-startup的话,就是在服务器启动的时候,自动执行init()函数。)
    - 处理来自客户端的对 service 方法的所有调用。(每次访问的时候执行)
    - 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它。
         除了生命周期方法之外,此接口还提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。 

Servlet接口里面的5个重要的方法。
这里写图片描述

servlet的体系结构:

  • HttpServlet中两个service,可以通过查看源码知道,其实执行的时候,从父类继承来的service()方法是调用了子类的service(HttpServletRequest,HttpServletResponse)方法的。所以无论如何都会执行子类的service方法的。而子类的方法里面有两个方法doGet()方法和doPost()方法,其实本质上在执行的时候就是执行doget()方法,可以自己new一个servlet类继承HttpServlet接口就可以看出来了。
    这里写图片描述
    servlet的生命周期:

  • 初始化方法init():第一次访问的时候才会调用
    服务的方法service():每次访问的时候都会调用
    销毁的方法destroy():服务器正常关闭,或者工程从服务器中移除的时候调用、


servlet中的一些api(方法):
这里写图片描述
servlet中获取请求参数和输出内容:

  • request.getParameter(String name) 从请求对象中获取到参数
    response.getWriter().println(String msg) 向页面中获取参数

详细:
servlet请求对象

  • getParameter(String name),从请求对象中获取参数 以 String 形式返回请求参数的值,如果该参数不存在,则返回
    null。请求参数是与请求一起发送的额外信息。对于 HTTP servlet,参数包含在查询字符串或发送的表单数据中。
           //获取请求参数
           String username = request.getParameter("username");
           String password = request.getParameter("password");

ServletResponse
servlet响应对象
getWriter() throws java.io.IOException向页面输出内容
返回可将字符文本发送到客户端的 PrintWriter 对象。PrintWriter 使用 #getCharacterEncoding 返回的字符编码。如果未如 getCharacterEncoding 中所述指定响应的字符编码(即该方法只返回默认值 ISO-8859-1),则 getWriter 会将字符编码更新到 ISO-8859-1。
如:

response.getWriter().println("")

response.getWriter().write("please comfirm your information……");

url-pattern的配置:

  • 完全匹配:以/开头
    目录匹配:以/开头,以*结尾
    后缀名匹配: .jsp,.action,.do,.xxx

优先级:完全匹配 > 目录匹配 > 后缀名匹配
一个Servlet可以对应多个路径
一个路径只能够对应一个Servlet

启动参数:
load-on-startup,在启动服务器的时候的时候自动进行初始化,自动调用了init(servletConfig)
数字越小,优先级越高 (一般系统的是1,所以最好自定义的就从2开始好了)
例如,在servers中的web.xml中有一个DefaultServlet,默认就启动了。这个东西是服务于静态的资源。就是静态资源是服务器一启动的时候就加载了。。。
这里写图片描述

  <servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>com.itheima.servlet.LoginServlet</servlet-class>
  <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/login</url-pattern>
  </servlet-mapping>

load-on-startup是可以写在自己写的servlet里面的。控制他们的加载优先级
这样写上之后,只要在服务器启动的时候就会自动启动。
作用:比如启动定时任务,检查数据库是否存在或者检查表是否存在。

servletConfig
其中getServletContext()重要
这里写图片描述
下述语句写在servlet标签里面
web.xml:

  <servlet>
    <description></description>
    <display-name>getServletConfigDemo</display-name>
    <servlet-name>getServletConfigDemo</servlet-name>
    <servlet-class>com.itheima.config.getServletConfigDemo</servlet-class>
    <init-param>
      <param-name>username</param-name>
      <param-value>root</param-value>
    </init-param>
    <init-param>
      <param-name>password</param-name>
      <param-value>123456</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>getServletConfigDemo</servlet-name>
    <url-pattern>/config</url-pattern>
  </servlet-mapping>

getServletConfigDemo:

public class getServletConfigDemo extends HttpServlet {
      private static final long serialVersionUID = 1L;
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           ServletConfig servletConfig = this.getServletConfig();
          //获取指定参数名参数
           String username = servletConfig.getInitParameter("username");
           System.out.println(username);
           response.getWriter().write("username:"+username);
          //获取所有参数名字
           Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
           while(initParameterNames.hasMoreElements()){
                 System.out.println(initParameterNames.nextElement());
           }
      }

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           doGet(request, response);
      }

}

servletConfig中最重要的是getServletContext()

获取上下文/全局上下文/全局管理者
主要作用就是用来共享servlet之间的数据
生命周期:
创建时间:服务器启动的时候就创建了
销毁时间:服务器关闭或者工程被移出的时候就销毁了
在整个应用程序中只有一个实例,保证了所有servlet用的都是相同的内容(单例设计模式)
获取方法:this.getServletContext();
这个方法本质上还是调用this.getServletConfig().getServletContext();

作用:
1)获取全局初始化参数
2)实现资源共享
3)获取资源路径
4)获取文件的mime类型。
5)获取绝对路径
6)获取流

实现资源共享:servletContext

xxxAttribute;
     setAttribute(key,value)
     getAttribute(key)
     removeAttribute(key)
  @Override
  public void init() throws ServletException {
       //获取上下文Context
       ServletContext servletContext = this.getServletContext();
       servletContext.setAttribute("count", 0);
       System.out.println("LoginServlet执行了");
  };

ServletContext
获取文件的mime类型:ServletContext.getMimeType();

     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           ServletContext servletContext = this.getServletContext();
           String f1 = "test.jpg";
           String mimeType = servletContext.getMimeType(f1);
           System.out.println(mimeType);
      }

获取文件的绝对路径:
注意:文件要放在webContent文件夹下
这里要说一下,这个路径其实是从工程下的Web-Content开始写的路径。

         ServletContext servletContext = this.getServletContext();
           String realPath = servletContext.getRealPath("/aaa.txt");
           System.out.println(realPath);

将一个文件读取到一个流中:

        ServletContext servletContext = this.getServletContext();
           InputStream resourceAsStream = servletContext.getResourceAsStream("/aaa.txt");
           System.out.println(resourceAsStream);

配置默认工程的默认主页:
web.xml中:

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

重定向:

//重定向

response.setStatus(302);
response.setHeader("location", "/Day15_0622_03MyLoginDemo/successLogin");

MD5加密
不可逆的加密算法

处理中文乱码问题:
unicode其实就是utf-8
如果是在servlet类中:具有response的类中:
//防止中文乱码

           response.setCharacterEncoding("utf-8");
           response.setHeader("Content-type", "text/html;charset=utf-8");
或
response.setContentType("text/html;charset=utf-8");

重点api:
getInitParameter(String name) 根据指定名称获取全局/局部初始化参数!调用函数的对象不同,获取的参数就是全局和局部的
用servletContext对象调用的就是全局的,用servletConfig对象调用的就是局部的参数
getInitParameterNames();

全局初始化参数:

例:

  <context-param>                    //全局配置  Context   服务器启动的时候加载配置
      <param-name>TestContextParam</param-name>
      <param-value>ContextParam01</param-value>
  </context-param>

  <servlet>                         //servlet内部的配置    调用了某个Servlet的时候它的配置才执行。
    <description></description>
    <display-name>TestServletConfig</display-name>
    <servlet-name>TestServletConfig</servlet-name>
    <servlet-class>com.itheima.servletConfig.TestServletConfig</servlet-class>
    <init-param>
      <param-name>testInitParam</param-name>
      <param-value>InitParam01</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServletConfig</servlet-name>
    <url-pattern>/test</url-pattern>
  </servlet-mapping>

在servlet类中:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取全局配置
            ServletContext servletContext = this.getServletContext();
           String initParameter = servletContext.getInitParameter("TestContextParam");
           System.out.println("get ContextParam:"+initParameter);
          //获取局部配置
           ServletConfig servletConfig = this.getServletConfig();
           String initParameter2 = servletConfig.getInitParameter("TestServletConfig");
           System.out.println("get ServletConfig"+initParameter2);
      }

javaEE经典三层架构:

 servlet:控制服务流程
 service:服务业务
 dao:dao操作数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值