• Servlet


    javaSE
    Java Applet ---- 运行在网页里面的java程序    类似今天flash
    Java Application

    服务器端 运行程序
    进程和线程
    进程应该是资源管理最小单位 内存分配给进程
    线程的程序执行的最小单位

    tomcat 申请了 100Mb内存
    Servlet程序1 线程 从100Mb 申请

    servlet入门
    1、新建web project
    2、新建servlet  -----> extends HttpServlet  修改 虚拟路径 /hello
    3、覆盖 doGet doPost  ---- > Http请求 提交方式 get post
    4、doGet(HttpServletRequest req, HttpServletResponse resp)
    HttpServletRequest =-=== 请求
    HttpServletResponse ---- 响应 --- 向客户端输出

    编写Servlet步骤
    继承 javax.servlet.http.HttpServlet
    web.xml配置Servlet的虚拟路径
    覆盖doGet、doPost

    http://localhost:8080/firstservlet/hello
    http://localhost:8080 本机tomcat
    /firstservlet 工程虚拟路径(工程名) tomcat
    /hello servlet虚拟路径

    Servlet虚拟路径:为一个Servlet类 指定一个 路径
    /hello  ----> cn.itcast.servlet.HelloServlet

    Servlet生命周期 init service destroy
    可能有多少次请求? 不确定
    在servlet被正式访问之前(在任何请求被处理之前)
    init()方法只在Servlet第一次被请求加载的时候被调用一次 ----- > 在所有请求之前 init 被执行一次
    service 方法 每接收一个请求 调用一次
    对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象

    destroy 方法 当容器退出时调用 -----> shutdown


    Servlet容器:服务器端程序tomcat ---> Servlet容器 ---- > 管理,加载、调度Servlet

    1、容器内写好了Servlet
    2、A 提交了第一次请求  ,容器创建了Servlet对象(构造方法),容器调用了对象的init方法,新建一个线程 ---> 调用service
    3、B 提交了一个请求,新建一个线程 ---> 调用service
    init和构造方法有什么区别
    为什么init方法的内容不写到构造方法里呢??
    当你的构造方法有特别复杂的逻辑时,是不是会导致对象创建比较慢
    Java里面:建议你将对象初始化的一些复杂逻辑代码写成单独的方法

    信息:正常情况下 implements Servlet
    init service destroy
    当有请求时 ----> service
    现在我们编写的Servlet extends HttpServlet
    当有请求时 ----> doGet doPost
    结论:service 调用了 doGet 和 doPost

    配置 Servlet自动加载?
    默认Servlet什么时候加载(创建对象 初始化) --- 第一次请求时
    如果你想让Servlet随服务器启动加载
    <load-on-startup>2</load-on-startup>  ---- 数字越小优先级越高 最高是0

    GenericServlet新增了一个无参数init()方法,目的是,开发人员无需覆盖生命周期init(ServletConfig),只需覆盖无参数init
    init(ServletConfi) 和 init() 关系: init(config) 调用了 init()

    1、服务器端是不是所有资源都得通过URL获得
    2、所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上
    3、配置Servlet路径 <Servlet> <Servlet-mapping>
    4、三种匹配方式
    同一个Servlet可以被映射到多个URL上
    第一种 完全路径匹配 例如:/hello ----- 必须以/ 开头
    第二种 路径匹配 例如:/abc/* ---- 必须以/开头 表示abc路径下所有请求
    第三种 扩展名匹配 例如 *.do ---- 不能以/开头 表示所有以.do结尾请求


    http://localhost:8080/firstservlet/index.html ----- > 并不是直接访问index.jsp文件的 ----> 实际上需要执行一个Servlet
    当你访问一个资源 路径找不到资源匹配的时候,会执行缺省Servlet
    JSP ----> JSP 就是Servlet

    ServletConfig 是一个配置对象,是Servlet容器用来在Servlet初始化阶段,传递信息给Servlet
    对象来自 :init(ServletConfig)
    补充:在开发中 继承HttpServlet  getServletConfig() 获得 ServletConfig对象

    主流应用
    获得字符集编码 ----- request response
    设置编码:response.setContentType
    获得数据库连接信息
    获得配置文件


    ServletConfig 和 Servlet 关系
    一个Servlet对象  对应 一个私有的ServletConfig ---- 配置多个 init-param

    ServletContext 是一个代表当前web应用的对象 ,一个web应用对应一个ServletContext对象
    ServletContext对象 是通过ServletConfig.getServletContext()获得
    ServletContext配置数据 --- 可以在任何一个Servlet获得

    ServletContext实现数据共享
    setAttribute 设置一个数据  getServletContext().setAttribute("info", info);
    getAttribute 取得一个数据 getServletContext().getAttribute("info");
    removeAttribute  删除一个数据

    重定向和转发
    张三:客户端
    李四、王五:服务器端
    1、重定向 张三找李四借钱(请求),李四不借,告诉张三找王五(响应),张三又去找了王五(请求),王五把钱给了张三(响应)
    两次请求,两次响应
    2、转发  张三找李四借钱(请求),李四去找了王五(转发),王五把钱给了张三(响应)
    一次请求 一次响应

    转发:服务器端资源内部调用

    ServletContext.getRequestDispatcher("资源A路径").forward(request,response);
    资源A 是一个Servlet --- 虚拟路径

    读取文件:用字节流读,用字符流读,用字符流解码字节流读取
    编码、解码
    String char[] --- byte[]   String.getBytes(charset);
    byte[] --- String   new String(byte[],charset);

    读取文件前提:找到文件 FileSystem路径,classpath路径

    src --- > java path
    bin ----> classpath

    编写web工程: 路径虚拟的

    当你想使用文件系统路径读取文件 : 虚拟路径---> 真实路径 ServletContext.getRealPath
    当你想使用classpath路径读取文件:需要得到ClassLoader 对象
    Thread.currentThread().getContextClassLoader().getResource(“info.txt").getFile();

    getRealPath -- ServletContext --- Servlet中使用

    文件读取(读文件、写文件)
    ResourceBundle.getBundle("cn/itcast/servlet/config").getString("name")  // 只能读,不能写
    写文件:必须拿到文件对象
    Properties类》????

    web 工程中
    绝对路径 以/ 开始
    服务器端和客户端对于/ 的区别
    假设有个工程 http://localhost:8080/url
    服务器端 / -----> http://localhost:8080/url/
    配置Servlet url-pattern : /link ----> http://localhost:8080/url/link

    客户端 / -----> http://localhost:8080/
    <a href="/link">link</a> ----> http://localhost:8080/link

    相对路径
    <a href="link">link</a>
    下一个路径是什么:当前路径 http://localhost:8080/url/index.html
    点击链接: http://localhost:8080/url/link

    aaa/a,html
    <a href="/servlet/link">绝对路径</a>   -----> http://localhost:8080/servlet/link 不行
    <a href="/url/servlet/link">绝对路径</a>

    **绝对路径 不管写在哪个html 不用修改


    http://localhost:8080/url/servlet/link
    相对路径
    http://localhost:8080/url/aaa/a.html
    <a href="../servlet/link">

    getServletContext().getRequestDispatcher("/aaa/a.html").forward(req,resp);  ----- / 服务器
    resp.setHeader("Location", "/url/aaa/a.html"); ----- / 客户端

    第一次
    当前:http://localhost:8080/url/index.html
    目标:http://localhost:8080/url/servlet/link
    相对<a herf="servlet/link">

    第二次
    当前路径:http://localhost:8080/url/servlet/link
    相对<a herf="servlet/link">
    http://localhost:8080/url/servlet/servlet/link ---- 404

  • 相关阅读:
    Console命令详解,让调试js代码变得更简单
    Css中常用中文字体的Unicode编码对照
    【JQuery】性能优化方法
    document.querySelector和querySelectorAll方法
    JavaScript获取手机屏幕翻转方法
    内层元素设置position:relative后父元素overflow:hidden overflow:scroll失效 解决方法
    【JQuery Zepto插件】图片预加载
    【JQuery插件】元素根据滚动条位置自定义吸顶效果
    【JQuery插件】团购倒计时
    禁止浏览器上下拖拽方法
  • 原文地址:https://www.cnblogs.com/qq809306794/p/Servlet.html
Copyright © 2020-2023  润新知