Servlet基础

动态资源

servlet就是在服务器端,接收请求并完成响应的java类

生命周期

三个方法 

init(ServletConfig config)        //第一次访问Servlet调用

servlet()    //接受请求并返回响应的方法

destroy()    //销毁Servlet调用



其他方法:

getServletConfig()            //返回ServletConfig对象,该对象是 init(ServletConfig config)中 服务器传过来的, 记录起来即可返回


ServletConfig类是什么?

封装了servlet的一些配置参数, 通过ServletConfig的各种方法可以参数的详细信息

Enumeration<String> getInitParameterNames()        //获取参数键的集合

String getInitParameter(String name)                         //根据 键 获取参数值

String getServletName()                                                //获取配置名称

ServletContext getServletContext()


GenericServlet    //封装好了    原始Servlet要必须实现的方法和一些必须操作, 减少用户进行一些无脑操作


线程安全问题:

Servlet是线程不安全的, 不能用成员变量去保存与线程相关的参数


Servlet的创建实例时机:在servlet注册的时候, 添加属性

 <load-on-startup>3</load-on-startup>

<!-- load-on-startup 用于让servlet随项目启动而启动
    填写一个正整数:0~5之间,
    数字越小启动优先级越高
    -->

设置访问路径:

相对路径配置:

            /AServlet  =>  http://localhost:8080/项目名称/AServlet

             /ABC/AServlet  =>  http://localhost:8080/项目名称/ABC/AServlet

            /ABC/*  =>  http://localhost:8080/项目名称/ABC/XXXXX    /ABC/  后面的xxx可以随意写, 都能访问

       后缀名匹配       =>  在servlet中很少使用 

     原则:1、匹配范围越大, 优先级越低

                2、不能同时使用相对路径匹配和后缀名匹配


ServletContext        Servlet的上下文对象

生命周期:随项目启动而启动, 项目关闭而消亡

功能:
可获取项目参数:

参数设置:在web.xml文件中添加参数

<context-param>
  	<param-name>name</param-name>
  	<param-value>jerry</param-value>
  </context-param>

参数获取:通过servletContext的以下方法

getInitParameterNames()        //返回一个Enumeration<String> 集合对象,封装了参数的key

en.hasMoreElements()   +     en.nextElement();                    //通过这个集合对象遍历 key 获得value


域功能:

Servlet三大域:

                    application

                    request

                     session

jsp技术中的域

                    page

Servlet(服务器组建)之间的通讯, 通过外部一个类, 在该类中定义静态变量(Map), 要发送信息的Servlet通过改变该类的静态变量去传递消息,接收的Servlet通过获取该类的静态变量去获取消息, 该类即是 ServletContext

application 域:这里就是一个Map, 是一个全局共享的域

操作域的方法:

Enumeration<String> getAttributeNames();

//向ServletContext中的map(域)放数据

sc.setAttribute("car", "BMW");

//从ServletContext中的map(域)中获取数据
String value = (String) sc.getAttribute("car");

//删除ServletContext中域的值

                sc.removeAttribute(key);

这里xxxAttribute(xxx)方法封装的操作实际是对map的操作


获得项目内的资源功能:

以输入流的形式来获取

InputStream is = new FileInputStream("D:\\xxx\\xxx\\xxx.xml");    //这种方式是以绝对路径的形式来获取的, 当路劲发生改变将无法运行

ServletContext 中设计 动态获取项目资源的方法 --> 使用相对路径

InputStream is = sc.getResourceAsStream("/xxx.xml");        //   '/' 代表根目录下   完整代表WebRoot下的xxx.xml资源

注:src目录下的文件, java文件会被编译成class文件放在classes文件下 ,  非java文件会被原封不动的放在classes目录下


Response中文乱码:都是因为编码码表和解码码表不一致, 输出中文建议使用字符流
解码码表设置字符流和字节流一样    ---->    response.setHeader("Content-type", "text/html;charset=码表");

字节流编码:

编码码表设置    ---->直接在    getBytes("码表")

字符流编码:

编码码表设置     --->    response.setCharacterEncoding("GBK");

还有一个java封装好的码表设置方法    response.setContentType(""text/html;charset=码表);     该方法会同时设置编码码表和解码码表

注:码表的设置一定要放在输出之前, 字符流与字节流不能同时使用


Request
中文乱码问题:页面编码与服务器解码码表不一致

GET请求

页面编码:发送端的编码码表 决定 浏览器显示时的解码码表

所以是由用户的html/jsp文件指定的

服务器解码码表:默认码表由tomcat的配置文件server.xml文件中

<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
               connectionTimeout="20000"
               redirectPort="8443" />                    //大概在70行位置

URIEncoding="UTF-8"指定的

也可以手动将     乱码的字符串 ----->转回解码前的0100100111  ------>将其用浏览器编码码表转回来


POST请求

post请求与get请求的 区别 在于他们的解码时间节点不同

get请求解码时间在 请求到达服务器时立即解码, 因为服务器必须对请求url全部解码,才知道访问的是哪一个Servlet, 而参数又直接写在url上的

post请求解码时间在调用获得参数时, 因为参数写在请求正文中

解决:

只要在调用获得参数带码前设置解码码表即可

//设置解码码表
req.setCharacterEncoding("UTF-8");

请求转发:

处理由两个或多个Servlet处理, AServlet处理一部分, 然后转到BServlet处理, 这个过程就叫做请求转发

实际是 ----》Servlet 与 JSP(JSP本质就是一个Servlet)结合    Servlet处理一部分逻辑, JSP处理一部分显示

语法:

req.getRequestDispatcher("/EServlet").forward(req, resp);
       (请求转移)          (发送转发)
域:在一个请求之内共享数据

用于请求转发时,数据的共享

注意:1、在转发的Servlet中不能向浏览器输出任何响应内容

            但是可以添加响应头

            留头不留体

        2、在转发之后不能再在本Servlet中操作request和response对象


重定向与转发的区别:

1、发送请求的次数: 重定向2次, 转发1次

2、能否访问外部地址:重定向不能, 转发可以

3、能不能使用request域共享数据:重定向不能, 转发可以

4、地址栏是否会发生变化:重定向(可能)会, 转发一定不会

5、请求方式是否会变化:重定向 可能会 因为重定向第二个请求一定是get

                                    转发 一定不会


请求包含:

                往往在两个或多个jsp中使用. 其中一个jsp封装相同部分, 其他jsp凡是需要显示相同部分,就可以把转载相同部分的jsp包含进来

    与转发的对比:

        1、转发中留头不留尾

             包含中留头又留尾

        2、转发中要求转发完成后,不能在操作request和response

              包含中没有这个限制

语法:

req.getRequestDispatcher("/GServlet").include(req, resp);
        (获取转移)         (发送包含)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值