Javaweb-04之tomcat,servlet,cookie

  1. web服务器软件:Tomcat
    1. 服务器:安装了服务器软件的计算机,
    2. 服务器软件:接受用户的请求,处理请求,做出响应
    3. web服务器软件:接收用户的请求,处理请求,做出响应

在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目

也被成为web容器

  常见的Java相关的服务器软件:

              weblogic:pracle公司,大型的Javaee服务器,支持所有的JAVAEE规范,收费的

               websphere:IBM公司的,收费的

                Jboss:Jboss公司的,收费的

               Tomcat:Apache基金组织,中小型的javaee服务器,仅仅支持少量的JavaEE规范,开源的,免费的。

安装:闪退

 配置环境变量:

 path:

%CATALINA_HOME%\bin

%CATALINA_HOME%\lib

---------------------------------

Servlet入门学习

servlet就是sun公司开发动态web的一门技术。

概念:运行在服务器端的小程序,servlet就是一个接口,定义了Java类被浏览器访问到)Tomcat识别)的规则。  将来我们自定义一个类,实现servlet接口,复写方法。

为什么需要映射;我们写的是Java程序,但是需要通过浏览器访问,而浏览器需要连接web服务器,所以我们哟啊在web服务器中注册我们写的servlet还需要给他一个浏览器能够访问的路径。

添加虚拟目录,方便被访问。

配置servlet:

<servlet>
    <
servlet-name>demo1</servlet-name>
  <
servlet-class>cn.servlet.servlet01</servlet-class>
</
servlet>
<
servlet-mapping>
    <
servlet-name>demo1</servlet-name>
    <
url-pattern>/demo1</url-pattern>
</
servlet-mapping>

执行原理:

  1. 当服务器接受到客户端浏览器的请求后,会解析请求url路径,获取访问的servlet的资源路径
  2. 查找web.xml文件,是否有对应的《url-pattern》标签体内容
  3. 如果有,则在找到对应的,servlet-class>全类名
  4. tomcat会将字节码文件加载进内存,并创建其对象
  5. 调用其方法

servlet3.0:

 好处:支持注解配置,可以不需要web,xml了

步骤:创建JavaEE项目,选择servlet的版本3.0以上,可以不创建web。xml

  定义一个类,实现servlet接口

复写方法

在类上使用@webservlet注解进行配置:在接口上面直接加一个:@WebServlet(urlPatterns = "/demo3")
或者直接写:@WebServlet("/demo3")

servlet体系结构

       servlet—接口

GenericServlet—抽象类:将servlet接口中的其他方法做了默认空实现,只将service方法作为抽象,将来定义servlet类时,可以继承GenericServlet,实现service()方法即可。

HttpServlet—抽象类:对http协议的一种封装,简化操作,

  1. 定义类继承httpServlet
  2. 复写doget和dopost方法

servlet相关配置:

       访问路径的配置;urlpartten:servlet访问路径

注解配置别忘记斜杠

       一个servlet可以定义多个访问路径:

@WebServlet("/demo3""/demo33"):这两个路径都可以访问得到
路径定义规则:/XXX        /xx/xxx多层路径,目录结构        *.do

--------------------------------------------------

Http:超文本传输协议:
定义了客户端和服务器端通信时,发送数据的格式
特点:基于TCPIP的高级协议
默认端口号:80
基于请求,响应模型的:一次请求对应一次响应
无状态的:每次请求之间相互独立,不能交互数据
历史版本:1.0:每一次请求响应都会建立新的连接
1.1:复用连接

请求消息数据格式:

请求行

请求头

请求空行

请求体

request响应原理

  1. tomcat服务器会给根据请求URI中的资源路径,创建对应的servletdemo1的对象
  2. tomcat服务器,会创建request和response对象,request对象中封装请求消息的数据
  3. tomcat将request和response两个对象传递给service方法,并且调用service方法
  4. 程序员可以通过request对象获取请求消息数据,通过response对象响应消息数据
  5. 服务器在给浏览器做出响应之前,会从response对象中拿出程序员设置的响应消息数据

1.1request对象和response对象的原理:

这两个对象是由服务器创建的,我们来使用

request对象是来获取请求消息,response对象来设置响应消息

中文乱码:

tomcat8之后get已经解决了中文乱码问题

post方式:会乱码,

解决方法:在dopost方法中加入一段代码:

转发端:

request.setCharacterEncoding(“utf-8”);   这里注意看前端页面是否也是utf-8

转发到的servlet位置:

 response.setContntType("text/html;charset=utf-8");

请求转发:

重定向:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responsedemo1")
public class Rersponsedemo1 extends HttpServlet {

   
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
System.out.println("demo111");
       
//跳转
//        response.setStatus(302);
//        response.setHeader("location","/web01/responsedemo2");
        //
简单的重定向
       
response.sendRedirect("/web01/responsedemo2");
    }


   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      
this.doPost(request,response);
    }
}

------

package com.zhang.response;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responsedemo2")
public class Rersponsedemo2 extends HttpServlet {

   
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
System.out.println("demo22222");
    }


   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
this.doPost(request, response);
    }
}

重定向的特点:redirect

       地址栏发生变化

       重定向可以访问其他站点的资源:比如百度

       重定向是两次请求,不能使用request对象来共享数据,

转发的特点:forward

       转发地址栏路径不变

       转发只能访问当前服务器下的资源

       转发是一次请求, 能使用request对象来共享数据

-----------------------------------

 共享数据:

demo8中:

 demo9中:

 servlstcontext对象  :跟上面效果一样,只不过不用写转发代码了。

demo8:

demo9:

 

概念:代表整个web应用,可以和程序的容器(服务器)来通信,

获取;

通过request对象获取,

通过HttpServlet获取

@WebServlet("/servletContextsemo1")
public class ServletContextsemo1 extends HttpServlet {
   
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//第一种方式
       
ServletContext con1 = request.getServletContext();
       
//第二种
       
ServletContext con2 = this.getServletContext();
       
System.out.println(con1);
       
System.out.println(con1==con2);


    }

   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
    }
}

重定向的特点:redirect

       地址栏发生变化

       重定向可以访问其他站点的资源:比如百度

       重定向是两次请求,不能使用request对象来共享数据,

转发的特点:forward

       转发地址栏路径不变

       转发只能访问当前服务器下的资源

       转发是一次请求, 能使用request对象来共享数据

会话技术:cookie  session:

会话技术:一次会话中包含多次请求和响应

一次会话:浏览器第一次传给服务器发送请求,会话建立,知道直到一方断开为止

会话的功能:在一次会话的范围内的多次请求间,共享数据

方式:

       客户端会话技术:Cookie

       服务器端会话技术:Session

Cookie:概念:客户端会话技术,将数据保存到客户端

快速入门:

使用步骤:

       创建cookie对象,绑定数据

       @new cookie (String name,String value)

       发送cookie对象

       @response.addcookie(cookie  cookie)

       获取cookie,拿到数据

       cookie[]  request.getcookie()

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//cookie快速入门
@WebServlet( "/cookiedemo1")
public class Cookiedemo1 extends HttpServlet {
   
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
       
Cookie c=new Cookie("msg","hehehe");
       
//发送cookie对象
       
response.addCookie(c);
    }

   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);

}}

---------------------------------------------

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//cookie快速入门
@WebServlet( "/cookiedemo2")
public class Cookiedemo2 extends HttpServlet {
   
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3,获取cookie
   
Cookie[] cs=request.getCookies();
   
//获取数据,遍历cookie
       
if(cs!=null){
           
for(Cookie c:cs){
               
String name = c.getName();
               
String value = c.getValue();
               
System.out.println(name+","+value);


            }
        }

    }

   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
    }
}

实现原理:

基于响应头set-cookie和请求头cookie实现

cookie的细节:

       一次可不可以发送多个cookie?

       可以

       可以创建多个cookie对象,使用response调用多次addcookie方法发送cookie即可,

       cookie在浏览器内存中保存多长时间?

默认情况下,当浏览器关闭后,cookie数据被销毁

持久化存储:

setmaxage(int seconds)

正数:将cookie数据写到硬盘的文件中,持久化存储,并指定cookie存活时间,时间到后,cookie文件自动失效

负数:默认值

零:删除cookie信息

cookie能不能存中文?

在tomcat 8 之前cookie中不能直接存储中文数据

需要将中文数据转码—一般采用url编码,在tomcat 8之后就支持中文编码了,

cookie的取值范围是多大?(共享问题)

假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?

默认情况下不能共享

setpath(String path):设置cookie的获值范围,默认情况下,设置当前的虚拟目录

如果要共享,则可以将path设置为 :“/”

不同的tomcat服务器间cookie共享问题?

setDomainin(String  path):如果设置一级域名相同,那么多个服务器之间cookie可以共享

setMomain(“,baidu.com”),那么,,,,,,可以共享,

cookie的特点和作用:

 cookie存储数据在客户端浏览器

浏览器对于单个cookie 的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)

作用:cookie一般用于存储少量的不太敏感的数据

在不登录的情况下,完成服务器对客户端身份识别

cookie案例:记住上一次访问时间

需求;访问一个一个servlet,如果是第一次访问,则提示:您好,欢迎您首次访问,

如果不是第一次访问,则提示,欢迎回来,您上次访问时间为:显示时间字符串,

分析:

可以用cookie来完成,

在服务器中的servlet判断是否有一个lasttime的cookie

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet( "/cookieTest")
public class CookieTest extends HttpServlet {
   
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
//先设置消息体的数据格式以及编码
       
response.setContentType("text/html;charset=utf-8");
       
//获取所有的cookie
       
Cookie[] cs=request.getCookies();
       
boolean flag=false;
       
//遍历cookie
       
if(cs!=null&&cs.length>0){
           
for(Cookie c:cs){
               
String name = c.getName();

              
//判断明层是不是lasttime
               
if("lastTime".equals(name)){
                    flag=
true;//lasttimecookie
                  //
如果有cookie不是第一次访问
                   
//设置cookievalue
                   
Date  date=new Date();
                   
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
                   
String strdate=sdf.format(date);
                   
System.out.println("编码前"+strdate);
                   
//url编码
                  
strdate= URLEncoder.encode(strdate, "utf-8");
                   
System.out.println("编码后"+strdate);
                   
c.setValue(strdate);
                   
//设置存活时间
                   
c.setMaxAge(60*60);
                    response.addCookie(
c);
                 
//响应数据
                 
//获取cookievalue
                 
String value=c.getValue();
                  response.getWriter().write(
"欢迎回来,你上次的访问时间是:"+value);
                 
break;
                }


            }
        }
       
if(cs==null || cs.length==0||flag==false){
           
Date  date=new Date();
           
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
           
String strdate=sdf.format(date);
           
System.out.println("编码前"+strdate);
           
//url编码
           
strdate=URLEncoder.encode(strdate,"utf-8");
           
System.out.println("编码后"+strdate);
           
Cookie cookie=new Cookie("lastTime",strdate);

           
cookie.setValue(strdate);
           
//设置存活时间
           
cookie.setMaxAge(60*60);
            response.addCookie(
cookie);
            response.getWriter().write(
"欢迎您首次访问");
        }


    }

   
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值