zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法提高 P0404
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    Java实现 蓝桥杯VIP 算法训练 排列问题
    关于模态/非模态对话框不响应菜单的UPDATE_COMMAND_UI消息(对对WM_INITMENUPOPUP消息的处理)
  • 原文地址:https://www.cnblogs.com/qq809306794/p/Servlet.html
Copyright © 2011-2022 走看看