zoukankan      html  css  js  c++  java
  • Servlet

     
    JavaWeb核心之Servlet
      教学导航
    教学目标    案例一、完成用户登录功能
    案例二、记录成功登录系统的人次
    教学方法    
    
    一、Servlet简介
    1.什么是Servlet
    Servlet 运行在服务端的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API    动态的向客户端输出内容
    
    servlet规范:包含三个技术点
    1)servlet技术
    2)filter技术---过滤器
    3)listener技术---监听器
    
    2.Servlet快速入门
    实现步骤:
    1)创建类实现Servlet接口
    2)覆盖尚未实现的方法---service方法
    3)在web.xml进行servlet的配置
    
    但在实际开发中,我们不会直接去实现Servlet接口,因为那样需要覆盖的方法太多,    我们一般创建类继承HttpServlet
    实现步骤:
    1)创建类继承HttpServlet类
    2)覆盖doGet和doPost
    3)在web.xml中进行servlet的配置
    
    
    画图描述整个访问过程:
    
    
    
    
    
    
    
    
    
    
    
    
    二、Servlet的API(生命周期)
    (1)Servlet接口中的方法
    1)init(ServletConfig config)
    何时执行:servlet对象创建的时候执行
    ServletConfig : 代表的是该servlet对象的配置信息
    
    2)service(ServletRequest request,ServletResponse response)
    何时执行:每次请求都会执行
    ServletRequest :代表请求 认为ServletRequest 内部封装的是                                        http请求的信息
    ServletResponse :代表响应 认为要封装的是响应的信息
    
    3)destroy()
    何时执行:servlet销毁的时候执行
    
    
    (2)HttpServlet类的方法
    1)init()
    2)doGet(HttpServletRequest request,HttpServletResponse response)
    3)doPost(HttpServletRequest request,HttpServletResponse response)
    4)destroy()
    
    (3)Servlet的生命周期(面试题)
    1)Servlet何时创建
    默认第一次访问servlet时创建该对象
    
    2)Servlet何时销毁
    服务器关闭servlet就销毁了
    
    3)每次访问必然执行的方法
    service(ServletRequest req, ServletResponse res)方法
    
    
    问题:对XXXServlet进行了10次访问,init(),destory(),service(),doGet(),doPost()    一共执行力多少次?request对象创建几个?response创建几个?
    
    三、Servlet的配置
    1.基本配置
    
    其中url-pattern的配置方式:
    1)完全匹配 访问的资源与配置的资源完全相同才能访问到
    2)目录匹配 格式:/虚拟的目录../*   *代表任意
    3)扩展名匹配 格式:*.扩展名
    
    注意:第二种与第三种不要混用 /aaa/bbb/*.abcd(错误的)
    
    
    
    
    2.服务器启动实例化Servlet配置
    Servlet的何时创建:默认第一次访问时创建
    为什么是默认?
    当在servlet的配置时 加上一个配置 <load-on-startup> servlet对象在服务器启动    时就创建
    3.缺省Servlet
    可以将url-pattern配置一个/,代表该servlet是缺省的servlet
    什么是缺省的servlet?
    当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理
    
    其实,web应用中所有的资源的响应都是servlet负责,包括静态资源
    
    4.欢迎页面
    
    
    
    四、ServletContext对象
    1.什么是ServletContext对象
    ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象    内部封装是该web应用的信息,ServletContext对象一个web应用只有一个
    
    问题:一个web应用有几个servlet对象?----多个
    
    
    ServletContext对象的生命周期?
    创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状        态))
    销毁:web应用被卸载(服务器关闭,移除该web应用)
    
    2.怎样获得ServletContext对象
    1)ServletContext servletContext = config.getServletContext();
    2)ServletContext servletContext = this.getServletContext();
    
    
    3.ServletContext的作用
    (1)获得web应用全局的初始化参数
    web.xml中配置初始化参数
    
    通过context对象获得参数
    
    
    
    
    
    
    (2)获得web应用中任何资源的绝对路径(重要 重要 重要)
    方法:String path = context.getRealPath(相对于该web应用的相对地址);
    
    (3)ServletContext是一个域对象(重要 重要 重要)
    什么是域对象?什么是域?
    存储数据的区域就是域对象
    
    ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向    servletcontext域中存取数据,数据可以共享)
    
    
    域对象的通用的方法:
    setAtrribute(String name,Object obj);
    getAttribute(String name);
    removeAttribute(String name);
    JavaWeb核心之Servlet

    个人总结:new--servlet---设置urlpattern(web.xml不用操作),servletcontext 3个功能 

    servlet简介

    Servlet 运行在服务端(tomcat)的Java小程序,是sun公司提供一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。但servlet的实质就是java代码,通过java的API  动态的向客户端输出内容

    包含三个技术点:1.servlet   2filter技术--过滤器 3listener技术--监听器

    快速入门:

    1)创建类实现Servlet接口

    2)覆盖尚未实现的方法---service方法

    3)在web.xml进行servlet的配置

    package com.heima.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletResponse;
    
    public class QuickStartServlet implements Servlet {
    
        @Override
        public void destroy() {
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void init(ServletConfig arg0) throws ServletException {
        }
    
        @Override
        public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
            System.out.println("qucikstartservlet running..");
            HttpServletResponse response=(HttpServletResponse) arg1;
            response.getWriter().write("heihei");
        }
    
    }
    /web13/src/com/heima/servlet/QuickStartServlet.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 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>web13</display-name>
      <servlet>
      <servlet-name>abc</servlet-name>
      <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class>
      </servlet>
      <servlet-mapping>
      <servlet-name>abc</servlet-name>
      <url-pattern>/qqqq</url-pattern>
      </servlet-mapping>
      <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>
    </web-app>
    /web13/WebContent/WEB-INF/web.xml

    servlet的api

    (1)Servlet接口中的方法

    1)init(ServletConfig config)

    何时执行:servlet对象创建的时候执行(tomcat创建该对象)

    ServletConfig : 代表的是该servlet对象的配置信息

    <servlet>
          <servlet-name>abc</servlet-name>
          <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class>
          <init-param>
              <param-name>url</param-name>
              <param-value>jdbc:mysql///abc</param-value>
          </init-param>
      </servlet>
    web.xml
    @Override
        public void init(ServletConfig config) throws ServletException {
            System.out.println("initing...");
            //1.得到servlet的name
            String servletName=config.getServletName();
            System.out.println(servletName);//abc
            //2.获得该servlet的初始化参数
            String initParameter=config.getInitParameter("url");
            System.out.println(initParameter);
            //3.获得ServletContext对象
            ServletContext servletContext=config.getServletContext();    
        }
    init

    2)service(ServletRequest request,ServletResponse response)

    何时执行:每次请求都会执行

    ServletRequest :代表请求 认为ServletRequest 内部封装的是                                                     http请求的信息

    ServletResponse :代表响应 认为要封装的是响应的信息

    3)destroy()

    何时执行:servlet销毁的时候执行

    (1)Servlet的生命周期(面试题)

    1)Servlet何时创建

    默认第一次访问servlet时创建该对象

    2)Servlet何时销毁

    服务器关闭servlet就销毁了

     3)每次访问必然执行的方法

    service(ServletRequest req, ServletResponse res)方法

    servletrequest内部封装的是http请求的信息

    servletresponse代表响应认为要封装的是响应的信息

    servlet的执行过程

    servlet配置

    1.基本配置

    2.服务器启动实例化Servlet配置

    Servlet的何时创建:默认第一次访问时创建

    为什么是默认?

    当在servlet的配置时 加上一个配置 <load-on-startup> servlet对象在服务器启动   时就创建

    <servlet>
          <servlet-name>abc</servlet-name>
          <servlet-class>com.heima.servlet.QuickStartServlet</servlet-class>
          <init-param>
              <param-name>url</param-name>
              <param-value>jdbc:mysql:///abc1</param-value>
          </init-param>
          <load-on-startup>3</load-on-startup>
      </servlet>
    View Code

    数字代表优先级,越小优先级越高

    3.缺省servlet

    可以将url-pattern配置一个/,代表该servlet是缺省的servlet

    什么是缺省的servlet?

    当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理。 其实,web应用中所有的资源的响应都是servlet负责,包括静态资源

    自定义web.xml查找动态的url,动态查找不到, tomcat conf下的apache-tomcat-7.0.52conf下的web.xml全局配置,查找静态webapp下的静态资源

    <servlet-name>default</servlet-name>
            <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    DefaultServlet查找静态资源,找出到输出404

    4.欢迎页面 

      <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>
    View Code

    输入http://localhost:8080/web13/,个人配置里没有动态默认配置,查找webap下的 index.html等文件。个人配置里没有欢迎页面配置,则查找全局配置下的web。xml配置

    HttpServlet

    eclipse新建servlet对象,继承HttpServlet,没有service方法,查看源码,查看继承对象。doGet里会调用service方法

     用户登录功能实现

    1.数据库操作支持: mysql驱动,DBUtils,连接池(lib和xml)2 web.xml(url对应servlet对象)  3.servlet对象

    package com.heima.servlet;
    
    import java.io.IOException;
    import java.sql.SQLException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import com.heima.domain.User;
    import com.heima.utils.DataSourceUtils;
    
    public class loginServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //1.获得用户名和密码
                String username =request.getParameter("username");
                String password=request.getParameter("password");
            //2.验证
            QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
            String sql="select * from user where username=? and password=?";
            User user=null;
            try {
                user=runner.query(sql, new BeanHandler<User>(User.class),username,password);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //3.根据返回结果
            if(user!=null){
                //成功
                response.getWriter().write(user.toString());
            }else{
                //失败
                response.getWriter().write("wrong username or password");
                
            }
            
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    /web13/src/com/heima/servlet/loginServlet.java

    servletContex对象

    什么是servletContext:ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象     内部封装是该web应用的信息,ServletContext对象一个web应用只有一个

    问题:一个web应用有几个servlet对象?----多个

     ServletContext对象的生命周期?

    创建:该web应用被加载(服务器启动或发布web应用(前提,服务器启动状 态))

    销毁:web应用被卸载(服务器关闭,移除该web应用)

    如何获得servletContext

    1)ServletContext servletContext = config.getServletContext();(一般不用)

    2)ServletContext servletContext = this.getServletContext(); 

    ServletContext的作用

    1.获得web应用全局的初始化参数

    web.xml中配置初始化参数

    通过context对象获得参数值

    2获得web应用中任何资源的绝对路径(重要 重要 重要)

    方法:String path = context.getRealPath(相对于该web应用的相对地址);

    3ServletContext是一个域对象(重要 重要 重要)

    什么是域对象?什么是域?

    存储数据的区域就是域对象

    ServletContext域对象的作用范围:整个web应(所有的web资源都可以随意向      servletcontext域中存取数据,数据可以共享)

     域对象的通用的方法:

    setAtrribute(String name,Object obj);

    getAttribute(String name);

    removeAttribute(String name)

    package com.heima.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ContextServert extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            response.getWriter().write("doGet runing...");
            //1.获得context对象
            ServletContext context=this.getServletContext();
            //1。初始化参数
            String initParameter = context.getInitParameter("name");
            System.out.println(initParameter);
            //2.获得  绝对路径 
            String realPath_A = context.getRealPath("/a.txt"); //   /目录为WebContent
            System.out.println(realPath_A);
            //3.域对象 存数据
            context.setAttribute("name", "heiheihei");
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    View Code

    实现记录用户登录次数功能

    package com.heima.servlet;
    
    import java.io.IOException;
    import java.sql.SQLException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.dbutils.QueryRunner;
    import org.apache.commons.dbutils.handlers.BeanHandler;
    
    import com.heima.domain.User;
    import com.heima.utils.DataSourceUtils;
    
    public class loginServlet extends HttpServlet {
        @Override
        public void init() throws ServletException {
            //zai context中存数据
            int count=0;
            this.getServletContext().setAttribute("count", count);
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            
            //1.获得用户名和密码
                String username =request.getParameter("username");
                String password=request.getParameter("password");
            //2.验证
            QueryRunner runner=new QueryRunner(DataSourceUtils.getDataSource());
            String sql="select * from user where username=? and password=?";
            User user=null;
            try {
                user=runner.query(sql, new BeanHandler<User>(User.class),username,password);
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //3.根据返回结果
            if(user!=null){
                //从context中取出count进行加运算
                Integer count = (Integer)this.getServletContext().getAttribute("count");
                count++;
                this.getServletContext().setAttribute("count", count);
                //用户登录成功
                response.getWriter().write(user.toString()+"you are success login "+count);
            }else{
                //失败
                response.getWriter().write("wrong username or password");
                
            }
            
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    /web13/src/com/heima/servlet/loginServlet.java
  • 相关阅读:
    Delphi-基础(for循环)
    Delphi-基础(运算符)
    Delphi-基础
    python 序列化
    python 模块、包
    time,datetime,random,os,sys,hashlib,logging,configparser,re模块
    第一章.Python环境安装&Pycharm日常使用
    第一章.变量.常量.注释.运算符.if流程控制
    Redis持久化数据介绍&主从复制和哨兵模式环境部署
    Redis缓存应用安装部署&常见的数据类型
  • 原文地址:https://www.cnblogs.com/hellowq/p/9391730.html
Copyright © 2011-2022 走看看