您的位置:首页 > 职场人生

Java面试知识点解析-01 —— Web篇(J2EE 相关知识点)

2019-04-29 14:07 351 查看

借参加过的多场Java开发面试,应聘岗位均为Java开发方向,在不断的面试中,又仔细对Java知识点进行复习和总结,也算是重新学习一下Java吧。

推荐收藏链接:Java 面试知识点解析

不涉及任何框架,对 J2EE 相关知识点的解析

1)Servlet 的生命周期?

在 Web 容器中,Servlet 主要经历 4 个阶段,如下图:

1. 加载 Servlet: 当 Tomcat 第一次访问 Servlet 的时候,Tomcat 会负责创建 Servlet 的实例。

2. 初始化 Servlet: 当 Servlet 被实例化之后,Tomcat 会调用 init() 方法来初始化这个对象。

3. 处理服务: 当浏览器访问 Servlet 的时候,Servlet 会调用 service() 方法处理请求。

4. 销毁: 当 Tomcat 关闭或者检测到 Servlet 要从 Tomcat 删除的时候,会自动调用 destroy() 方法,让该实例所占用的资源释放掉。一个 Servlet 如果长时间不被使用的话,也会被 Tomcat 自动销毁。

简单总结:只要访问 Servlet ,就会调用其对应的 service() 方法,init() 方法只会在第一次访问 Serlvet 的时候才会被调用。

2)Servlet 的请求流程?
  • 浏览器发出请求

    http://localhost:80/xxx1/xxx2
    (80端口可以默认不写,因为这是http协议默认的端口,平时我们访问
    https://www.baidu.com/
    时其实访问的是
    https://www.baidu.com:80/

  • 服务器解析请求信息:

    http: 协议名称
  • localhost: 访问的是互联网中的哪一台计算机
  • 80: 从主机当中找到对应 80 端口的程序 (这里即为 Tomcat 服务器)
  • /xxx1: 当前项目的上下文路径 (即在 server.xml 中配置主机时配置的 path属性)
  • /xxx2: 当前请求的资源名
  • 解析 Tomcat 服务器根目录下的 /config/server.xml 文件:
    < Context docBase=“D:\javaPros\test\webapp” path=“xxx1” />
    判断哪一个

    < Context />
    元素的 path属性 属性为 xxx1

      若找不到,则返回 404错误
    • 若找到了,则解析该
      <Context />
      元素,得到
      docBase
      属性,获取当前访问 Web 项目的跟的绝对路径:
      D:\javaPros\test\webapp
  • D:\javaPros\test\webapp
    下的
    WEB-INF
    下找到
    web.xml
    文件
    判断
    web.xml
    文件中是否有
    <url-pattern>
    的文本内容为
    /xxx2

      若找不到,则返回 404错误
    • 若找到了,则继续获取该资源对应 Servlet 类的全限名称xxx.xxx
  • 判断 Servlet 实例缓存池 中是否有

    xxx.xxx
    的对象

    Map<String,Servlet> cache = ......(Tomcat提供的);
    
    key: 存Servlet类的全限定名称
    value: 该Servlet类的对象.
    
    Servlet obj = cache.get("xxx.xxx");
    if(obj==null){
    //Servlet实例缓存中没有该类的对象,第一次.
    GOTO 6:
    }else{
    //有对象,非第一次.
    GOTO 8:
    }

      使用反射调用构造器,创建对应的对象

      obj = Class.forName("xxx.xxx").newInstance();

      把当前创建的
      Servlet
      对象,存放在缓存之中,
      供给下一次的使用.

      cache.put("xxx.xxx",obj);

    • 创建

      ServletConfig
      对象,并调用
      init()
      方法.
      obj.init(config);

    • 创建

      ServletRequest 对象
      ServletResponse 对象
      ,并调用
      service()
      方法.
      obj.service(req,resp);

    • service()
      方法中对浏览器作出响应操作。

    3)Servlet 是单例的吗?为什么?

    Servlet
    是单例的,浏览器多次对
    Servlet
    的请求,一般情况下,服务器只创建一个
    Servlet
    对象,也就是说,
    Servlet
    对象一旦创建了,就会驻留在内存中,为后续的请求做服务,直到服务器关闭。

    4)GET 和 POST 的区别

    要知道,GET 和 POST 都是请求方式

    1. GET:

    浏览器器地址栏:

    http://localhost/test.html?name=wmyskxz&sex=male

    这里提交了两个参数,一个是

    name
    属性值为
    wmyskxz
    ,另一个是
    sex
    属性值为
    male
    ,这是一种直接的请求方式,在请求资源后面跟上
    ?
    符号与参数连接,其他的参数使用
    &
    符号连接。

    • 缺点:
      1.暴露请求信息,不安全
      2.请求信息不能超过1kb,可传输的信息有限,不能上传图片

    2. POST:

    浏览器地址栏:

    http://localhost/test.html#

    • 优点:
      1.隐藏了请求信息,较安全(但仍可以通过相关工具访问到数据)
      2.POST 方式没有限制请求的数据大小,可以做图片的上传
    5)Tomcat 中如何解决中文乱码问题?

    Tomcat 服务器中,接受请求的时候,默认的编码方式为 ISO-8859-1,而该编码方式只占一个字节,不支持中文(两个字节),所以当我们做请求的时候,会出现乱码的问题

    解决方案:

    1.对乱码使用 ISO-8859-1 解码,转换成byte数组,恢复为二进制

    byte[] data = name.getBytes("ISO-8859-1");

    2.对byte数组重新进行 UTF-8 编码:

    name = new String(data,"UTF-8");

    但是这样会出现一个问题,那就是当表单数据太多的时候,这样反复解码-编码,会很繁琐。

    终极解决方案:

    1.对于 POST 请求:
    设置请求的编码方式:

    request.setCharacterEncoding("UTF-8");

    注意:必须在获取第一个参数之前设置,并且该方式只对 POST 方式有效

    2.对于 GET 请求:
    重新设置 Tomcat 的编码方式,修改 Tomcat 的配置文件:

    Tomcat根目录/conf/serve
    3ff7
    r.xml(修改端口的那一行)

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫描二维码加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。

  • 内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: