Servlet

一、Servlet概述

1.什么是Servlet

Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据;

  • 处理请求;

  • 完成响应。

2.实现Servlet的方式

  • 实现javax.servlet.Servlet接口

  • 
    public class BServlet implements Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
    
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            //得到请求参数
            String username = servletRequest.getParameter("username");
            String age = servletRequest.getParameter("age");
            //System.out.println("username:"+username);
            //System.out.println("age:"+age);
            //得到响应输出流
            // 写js脚本
            //servletResponse.getWriter().print("<h1>hello client</h1>");
            if(username != null && username.equals("张三")){
                //跳转到index.html    使用js脚本  location.href 赋一个url, 实现页面跳转
                servletResponse.getWriter().print("<script>location.href='/index.html'</script>");
            }else{
                servletResponse.getWriter().print("<script>alert('fail');location.href='/demo.html';</script>");
            }
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

  • 继承javax.servlet.GenericServlet抽象类

  • public class CServlet  extends GenericServlet {
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            servletResponse.getWriter().print("CServlet....");
        }
    }

  • 继承javax.servlet.http.HttpServlet抽象类 实际开发中使用这种方式

  • /**
     * 实现Servlet的第三种方式, 继承HttpServlet
     */
    // name 忽略:
    //@WebServlet(name="DServlet",urlPatterns="/DServlet")
    //@WebServlet(urlPatterns="/DServlet")
    //urlPatterns 与value 等同
    //@WebServlet(value="/DServlet")
    // 如果只给value赋值,  省略 value=
    @WebServlet("/DServlet")
    public class DServlet extends HttpServlet {
        //处理get请求
        @Override
        protected void doGet( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().print("DServlet....");
        }
    
        //处理post请求
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        }
    }

 在WEB-INF/web.xml文件中进行配置(老方法)

<!--配置Servlet, 一个Servlet类绑定一个url(客户端访问入口)-->
  <servlet>
      <!-- 名称 随意取, 一般取名类名-->
      <servlet-name>AServlet</servlet-name>
      <!--对应的Servlet类, 全限定名(包.类名) -->
      <servlet-class>com.fs.web.AServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <!--名称, 与对应servlet的servlet-name一样 -->
      <servlet-name>AServlet</servlet-name>
      <!--绑定url: /路径  一般取名: /类名 -->
      <url-pattern>/AServlet</url-pattern>
  </servlet-mapping>

二、Servlet接口

1.Servlet的生命周期

描述Servelet的一生, 从生到死过程

  1. 默认情况: Servlet第一次请求的时候,由Tomcat创建

  2. 调用init()方法

  3. 用户每请求一次这个Servlet, tomcat调用一次service()方法

  4. 当Tomcat服务器关闭之前, 销毁它创建的所有对象,包含创建Servlet, 在Servlet销毁之前, 调用destroy()

2.Servlet中的其他对象

  1.ServletConfig 对象: 对应Servlet的配置, Tomcat创建

  1. 获取Servlet的初始化参数 参数名,参数值 都是String类型

String getInitParameter(String name) 根据初始化参数名获取初始化参数值

Enumeration<String> getInitParameterNames() 获取所有的初始化参数name

<servlet>
      <!-- 名称 随意取, 一般取名类名-->
      <servlet-name>AServlet</servlet-name>
      <!--对应的Servlet类, 全限定名(包.类名) -->
      <servlet-class>com.fs.web.AServlet</servlet-class>

      <!--配置初始化参数-->
      <init-param>
          <param-name>name</param-name>
          <param-value>张三</param-value>
      </init-param>
      <init-param>
          <param-name>age</param-name>
          <param-value>21</param-value>
      </init-param>
  </servlet>

2.ServletContext getServletContext() 得到ServletContext , 最大域对象(Application域)

2.ServletRequest对象: 请求对象, 后面详细讲 核心 Tomcat创建

核心方法: 获取请求参数

String getParameter(String name) 根据请求参数name获取请求参数值

前端发送请求有哪些方式:

  1. form 的action 可以是get,post method: 默认值get, 设置post,发送post请求

  2. 超链接<a href=""> 只能get

  3. 直接在浏览器地址栏输入url 只能get

  4. js发送ajax请求 可以是get,post

请求方式: GET请求/POST请求

get请求: 请求参数通过url传递, 请求参数 url: url?k1=v1&k2=v2&...

不安全, 传递字符串, 不能传递文件数据

post请求: 请求参数通过请求体传递,

安全性高, 传递字符串, 传递文件数据

3.ServletResponse对象: 响应对象, 后面详细讲 核心 Tomcat创建  

getWriter() 得到字符响应输出流, 服务器通过改输出流,把数据写到客户端的浏览器页面上

System.out.println(): 把数据打印到服务器的控制台

System.out.println("AServlet 正在服务...");
        //获取Servlet配置
        //System.out.println("Servlet的名字:"+servletConfig.getServletName());
        //获取初始化参数
        //根据初始化参数名获取值
        String name = servletConfig.getInitParameter("name");
        System.out.println("name:"+name);
        //获取所有的初始化参数名
        Enumeration<String> names = servletConfig.getInitParameterNames();
        //遍历
        while(names.hasMoreElements()){
            String key = names.nextElement(); //参数名
            String value = servletConfig.getInitParameter(key);
            System.out.println("key:"+key+"--value:"+value);
        }

三、注解servlet

解: 特殊的接口, 在方法,类,属性.... @注解名 (创建注解类的对象)

类类型: class interface enum @interface

注解作用: 替换配置文件

常用! 

@WebServlet注解 替换servlet的配置文件

// name 忽略:
//@WebServlet(name="DServlet",urlPatterns="/DServlet")
//@WebServlet(urlPatterns="/DServlet")
//urlPatterns 与value 等同
//@WebServlet(value="/DServlet")
// 如果只给value赋值,  省略 value=
@WebServlet("/DServlet")

四、servlet细节

  1. servlet是否是一个线程安全? 判断依据: 多个线程是否共享同一资源, 是共享, 线程不安全, 不是共享, 线程安全

AServlet类在Tomcat只有一个对象, 多个请求,请求的同一个Servlet对象, 多个线程使用的同一个对象, Servlet对象共享, 线程不安全

一定不要再Servlet提供存放数据的属性

2.Servlet的url-pattern: 给这个servlet绑定一个url

1.一个Servlet只能绑定一个Url?

可以绑定多个url, 但是实际开发一般只绑定一个

2.url-pattern的写法

  • /字符串 绑定确定的url

  • 结合 * (通配符, 任意)

    • /user/* 前缀匹配, 只要前面是/user开头,后面的任意 /user/a /user/b

    • *.后缀名 后缀匹配, 只要url后面以 后缀名结尾的都匹配 *.do a.do c.do

注意: /*.后缀名 错误写法

- /* 匹配所有

url的匹配, 越精确,优先级越高, 没有*的url优先级高于有*的

3.Servlet的默认创建时机: 第一次请求该Servlet才创建, 第一次惩罚, 第一次请求耗费时间多一点

修改Servlet的创建时机: 在web服务器启动的时候,创建Servlet

<servlet>
      <!--设置tomcat启动的时候,创建-->
      <load-on-startup>非负整数</load-on-startup>
  </servlet>

load-on-startup 中的数字越小,越先创建

注解:

@WebServlet(value="/*",loadOnStartup=2)

 

五、ServletContext(上下文)

与天(tomcat)同寿

ServletContext 在Tomcat启动的时候创建, 在tomcat关闭的时候销毁, 在整个web项目中只有一个

在Web项目任何一个用户任何一个地方都可以访问

作用: 作为全局共享数据容器

称为域对象 ServletContext 称为application域

域对象作用: 存放数据,取数据, key/value对结构 key: String value:Object

javaWeb中有四大域:

application域 整个项目有效

session域 常用 在同一次会话内有效

request域 常用 在同一次请求内有效

page域 在同一个页面/Servlet有效: 等同于this

域对象都有下列方法

void setAttribute(String name,Object object) 往域中存数据, 如果name不存在,就添加,如果name存在,覆盖object

Object getAttribute(String name) 从域中获取数据, 如果name不存在, 返回null

removeAttribute(String name) 从域中删除数据

Enumeration<String> getAttributeNames() 获取域中所有的name

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值