Servlet和Themyeleaf

一).设置编码
    tomcat8之前
    1)GET请求
    get方式不需要设置编码(基于tomcat.8.0)
    如果get请求发送的中文数据,转码稍微有点麻烦
    String fname=request.getParaFarameter("fname")
    1.将字符转换成数组
    byte[] byte=fname.getBytes("ISO-8850-1")
    2.然后将字节数组按照设定的编码重新组装成字符串
    Fname -new String(Bytes,"UTF-8");
    2)POST请求
            //post方式下,设置编码,防止中文乱码
            //需要注意的是,设置编码这一句代码必须在调用所有参数之前
            request.setCharacterEncoding("UTF-8");
    tomcat8开始
    request.setCharacterEncoding("UTF-8");
    post要在最前面

二).Servlet的继承关系
    1.继承关系
    javax.servlet.Servlet接口
        javax.servlet.genericServlet抽象类
           javax.servlet.http.HttpServlet抽象子类
    2.相关方法
    javax.servlet.Servlet接口;
    void init(config)-初始化方法
    void service(request,response)-服务方法
    void destory() 销毁方法
    javax.servlet.genericServlet抽象类
    void service(request,response)-仍然是抽象的
    javax.servlet.http.HttpServlet
    void service(request,response)不是抽象的
    1. String method =req.getMethod-获得请求方式
    2. 各种if判断,根据请求方式不同,决定去调用不同的do方法
    if (m.getName().equals("doGet")) {
                    ALLOW_GET = true;
                    ALLOW_HEAD = true;
                }

                if (m.getName().equals("doPost")) {
                    ALLOW_POST = true;
                }等等
    3. 在HttpServlet这个抽象类中,do方法都类似
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String msg = lStrings.getString("http.method_get_not_supported");
        this.sendMethodNotAllowed(req, resp, msg);
    }
    3.小结:
    1)继承关系:HttpServlet ->GenricServlet -> Servlet
    2)Servlet中的核心方法: init(),service(),destro(),
    3)service:当有请求发过来时,service方法会自动响应(其实是tomcat容器调用的)
        在Httpservlet中我们会去分析请求方式,到底是get,post,head还是delet等等
        然后再决定用那个do开头的方法
        那么在HttoServlet中这些do方法默认都是默认405的实现风格-要我们子类去实现对应的方法,否则会默认报405错误
    4)因此,我们在新建servlet时,我们才会考虑请求的方法,从而决定重写那个do方法


3.Servlet的生命周期
    1)声明周期,从出生到死亡的过程就是生命周期,对应servlet中的三个方法,init,service,destory
    2)默认情况下:
        第一次接受请求时,这个servlet会进行实例化,初始化init,然后服务sevice,销毁destroy,
        第二次请求开始,每一次都是服务
        当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法
    3)通过案例我们发现:
        servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应
        默认情况下,第一次请求时,tomcat才会去实例化,初始化,然后在服务化,
        这样的好处是什么?提高系统的启动速度
        这样的缺点是?第一个用户等待的时间长,
        因此得出结论:如果需要提高的启动速度,我们应该设定servlet初始化时机
    4)Servlet的初始化时机:
        默认是第一次接受请求时,实例化,初始话
        我们可以通过<load-on-startup>--时间越小,用时越短,我们也可以控制谁先启动,最小值为0

    5) Servlet在容器中是:单例的、线程不安全的
        -单例:所有的请求都是同一个实例去响应
        -线程不安全:一个线程需要根据这个实例中的莫个成员变量值去做逻辑判断,但是在莫个时机,另一个线程将成员变量进行更改,导致成员变量更改
        -我们已经知道了servlet是线程不安全的,给我们的启发是:尽量不要定义成员变量,如果不得不定义成员变量,不要进行修改,不要用成员变量进行逻辑判断




4.Http协议
    1):http称之为超文本传输协议
    2):http是无状态的
    3):http请求包含两个部分;请求和响应
    -请求:
       1. 请求包含三个部分:1.请求行 ; 2.请求消息头 ;3.请求主题
       2. 请求行包含二个信息:1.请求的方式;2.请求url;3.请求的协议(一般是http)
       3. 请求消息头:包含了很多客户端需要告诉服务器的信息,比如:我的浏览器型号,版本,等一些基本信息
       4.请求体,三种方式
       get方式,没有请求体,但是有一个queryString
       post方式,有请求体,form,data
       json格式,有请求体,request payload
      -响应:
      响应也包含三部分;响应行,响应头,响应体
      1)响应行包含三个信息,1.协议  2.响应状态码 3.响应状态(ok)
      2)响应头responst:包含了服务器的信息,服务器发送给浏览器的信息(内容的媒体编码还有日期等等)
      3)响应体:响应的实际内容(比如add.html页面时,响应的内容就是(body form))
5.会话
    1)Http是无状态的
        -http 无状态 :服务器无法判断这两次请求是同一个客户端发过来的,还是不同客户端发过来的
        -无状态带来的现实问题:第一次请求添加商品到购物车,第二次是结账
        -通过会话跟踪技术来解决此问题
        S:请告诉我你的绘画ID
        C:没有!
        S:哦,那我知道了,你是第一次给我发请求,我给你分配一个sessionID:123
        S:请告诉我你的绘画ID
        C:123
        S:你是****,上次什么时间访问我的,
    2) 会话跟踪技术
           -客户端第一次发请求给服务器,服务器获取session,获取不到,则创建新的,然后响应给客户端
           -下次客户端给服务器发请求时,会把session带给服务器
           -常用的api,理解使用
           request.getSession() -> 效果和不带参数相同
           request.getSession(false) ->获取当前会话,没有则返回null,不会创建新的

           session.getId() ->获取sessionId
           session.isnew() ->判断当前是不是新的
           httpSession.getMaxInactiveInterval()->seesion的非激活间隔时长,默认1800秒-不操作的时间长
           httpSession.invalidate() ->让会话立即失效
            。。。。。
    3) session保护作用域
        -session保存作用域和具体的莫一个sessuon对应的
        -常用的api
        void session.setAttribute(k,v)
        object session.getAttribute(k)
        void removeAttribute(k)
6.服务器内部转发以及客户端重定向
    1)服务器内部转发:requset
    -一次请求响应的过程,对于客户端而言,内部经理的多少次转发,客户端是不知道的
    -地址栏没有变化
    2)客户端重定向:response.sendrediresete
    -两次请求不同url是知道的
    -地址栏有变化
    eg1:
        客户端:小米
        服务器端:医院
        服务器组件:医生
        小米腿疼:需要开刀,在医院等待手术
        张三拿着刀过来发现自己时脑壳医生,这个手术做不了
        张三立刻找李四医生请求,让李四来完成这台手术
        对于小米而言,手术做完,她不知道,
    eg2:
          客户端:小米
          服务器端:医院
          服务器组件:医生

          小米腿疼:需要开刀
          张三拿着刀过来发现自己时脑壳医生,这个手术做不了
          告知小米去腿课去看,
          小米去找李四看病,让李四来完成这台手术
          对于小米而言,手术是李四做的

7.Thymeleaf -视图模板技术
  1)添加thymeleaf的jar包
  2)新建一个Servlet类ViewBaseServlet
  3)在web.xml文件中添加配置
        -配置前缀 view-prefix
        -配置后缀 view-suffix
<context-param>
    <param-name>view-prefix</param-name>
    <param-value>/</param-value>
</context-param>
<context-param>
    <param-name>view-suffix</param-name>
    <param-value>.html</param-value>
</context-param>

       4)使得我们的Servlet继承ViewBaseServlet

       5)根据逻辑视图名称 得到 物理视图名称
        //此处视图名称是 index
        //thymeleaf会将这个逻辑视图对应到物理视图名称
        //物理视图= 前缀+逻辑视图名称+后缀
        //所以:名称为 index.html

        super.processTemplate("index", req, resp);

        6)使用thymeleaf的标签

        th:if -----------th:if="${#list.isEmpty{session.fruitList}"
        th:unless ----th:unless ="${#list.isEmpty{session.fruitList}"
        th:each-------th:each="fruit:${session.fruitList}"
        th:text--------th:text="${fruit.fname}"

 

       

 
        

        



响应代码
//200:正常响应
//404:找不到资源
//405:请求方式不对
//500:服务器内部代码错误
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值