offer-javaweb

JAVAWEB

HTML

  1. HTML是解释型的文本标记语言,不区分大小写
  2. html,head,title,meta,body,br,p,hr,div,table,form,u,i,b,sup,sub,&nbsp,span,ul,ol,li,tr,td,th,h1-h6,a,input,select,textarea,img
    2-1. html , head , title , meta , body , br , ul , ol , h1-h6 , a , img , &nbsp, p , div , span
    2-2. table tr , th , td
    2-3. form(action=’’ , method=’post’) input type=’text,pasword,radio,checkbox,submit,button,reset” select , textarea
    2-4. frameset表示页面框架、frame表示框架中的具体页面引用;iframe在一个页面嵌入一个子页面。

CSS

简介

层叠式样式表
被style标签包围的环境为CSS环境,可以写CSS代码,值 “text/css” 指示内容是标准的 CSS。

1
2
3
4
<style type="text/css">

</style>

CSS的分类:标签样式表、类样式表、ID样式表、组合样式表
CSS从位置上的分类:嵌入样式表、内部样式表、外部样式表

盒子模型

  1. border(-top/-left…)
  2. margin 和 padding 注意浏览器的兼容问题!
    tips:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    body{
    margin:0;
    padding:0;
    }
    ```

    ### CSS布局
    position: absolute -- 绝对定位 , 需要配合使用 left , top
    relative -- 相对定位 , 一般会和 float , margin , padding .... 一起使用

    ## JavaScript
    Javascript : 客户端的一个脚本语言
    js是一门弱类型的语言 , 变量的数据类型由后面赋的值的类型决定
     <script language="javascript">
         
         /*
         var str = "hello world";
         alert(typeof str);
         str = 9999 ;
         alert(typeof str);
         */
         /*
         var person = new Object();
         person.pid = "p001";
         person.pname="鸠摩智";
    
         alert(person.pid+"_"+person.pname);
         */
         //java 方法
         public String hello(String name){
             return "hello to " + name ;
         }
    
         //js 方法
         function hello(num1 , num2 , name){
             if(num1>num2){
                 return "hello to" + name ;
             }else{
                 alert("HELLO");
             }
         }
     </script>
    

## WEB  
1. C/S:客户端服务器架构模式  
    优点:充分利用客户端机器的资源,减轻服务器的负荷(一部分安全要求不高的计算任务存储任务放在客户端执行,不需要把所有的计算和存储都在服务器端执行,从而能够减轻服务器的压力,也能够减轻网络负荷)  
    缺点:需要安装客户端;升级维护成本较高  

2. B/S:浏览器服务器架构模式  
    优点:客户端不需要安装;维护成本较低  
    缺点:所有的计算和存储任务都是放在服务器端,服务器的负荷较重;在服务端计算完成之后把结果再传输给客户端,因此客户端和服务端会进行非常频繁的数据通信,从而网络负荷较重  

### Tomcat  
Web容器:
1. Tomcat的安装和配置
    * 解压:不要有中文不要有空格  
    * 目录结构说明 :
        bin 可执行文件目录  
        conf 配置文件目录  
        lib 存放lib的目录  
        logs 日志文件目录  
        webapps 项目部署的目录  
        work 工作目录  
        temp 临时目录  
        deploy :部署  
        baidu> context root  
    * 配置环境变量,让tomcat能够运行因为tomcat也是用java和C来写的,因此需要JRE,所以需要配置JAVA HOME  
    * 启动tomcat,然后访问主页  
2. 新建Web项目,并在tomcat中部署最后再访问  

### Servlet  
#### 使用场景  
1. 用户在html的表单添加请求,action="add",method="post"
2. 新建AddServlet文件,继承HttpServlet,重写doPost或doGet方法,通过request.getParameter根据name值获取表单中的属性,以及添加其他有关数据库的代码。    
3. WEB-INFO目录下的web.xml文件中添加映射配置:  
```xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>AddServlet</servlet-name>
        <servlet-class>com.atguigu.servlets.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddServlet</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>
    <!--
    1. 用户发请求,action=add
    2. 项目中,web.xml中找到url-pattern = /add   -> 第12行
    3. 找第11行的servlet-name = AddServlet
    4. 找和servlet-mapping中servlet-name一致的servlet , 找到第7行
    5. 找第8行的servlet-class -> com.atguigu.servlets.AddServlet
    6. 用户发送的是post请求(method=post) , 因此 tomcat会执行AddServlet中的doPost方法
    -->
</web-app>

可以通过welcome-file-list标签进行设置欢迎页(在tomcat的web.xml中设置,或者在自己项目的web.xml中设置)。

设置编码

post方式下,doPost开头设置编码,在所有获取参数动作之前,防止中文乱码


    request.setCharacterEncoding("UTF-8");

get方式目前不需要设置编码(基于tomcat8),tomcat8之前,设置编码,.getBytes(“xxx”),再重新组装成格式

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) - 不是抽象的

    • String method = req.getMethod(); 获取请求的方式
    • 各种if判断,根据请求方式不同,决定去调用不同的do方法
      if (method.equals(“GET”)) {
      this.doGet(req,resp);
      } else if (method.equals(“HEAD”)) {
      this.doHead(req, resp);
      } else if (method.equals(“POST”)) {
      this.doPost(req, resp);
      } else if (method.equals(“PUT”)) {}…
    • 在HttpServlet这个抽象类中,do方法都差不多:
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String protocol = req.getProtocol();
            String msg = lStrings.getString("http.method_get_not_supported");
            if (protocol.endsWith("1.1")) {
                resp.sendError(405, msg);
            } else {
                resp.sendError(400, msg);
            }
        }
    

Servlet的生命周期

  1. 生命周期:从出生到死亡的过程就是生命周期。对应Servlet中的三个方法:init(),service(),destroy()
  2. 默认情况下:
    • 第一次接收请求时,这个Servlet会进行实例化(调用构造方法)、初始化(调用init())、然后服务(调用service())
    • 从第二次请求开始,每一次都是服务
    • 当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法
  3. 通过案例我们发现:
    • Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应。
    • 默认情况下,第一次请求时,tomcat才会去实例化,初始化,然后再服务.这样的好处是什么? 提高系统的启动速度 。 这样的缺点是什么? 第一次请求时,耗时较长。
    • 因此得出结论: 如果需要提高系统的启动速度,当前默认情况就是这样。如果需要提高响应速度,我们应该设置Servlet的初始化时机。
  4. Servlet的初始化时机:
    • 默认是第一次接收请求时,实例化,初始化
    • 我们可以通过load-on-startup来设置servlet启动的先后顺序,数字越小,启动越靠前,最小值0
  5. Servlet在容器中是:单例的、线程不安全的
    • 单例:所有的请求都是同一个实例去响应
    • 线程不安全:一个线程需要根据这个实例中的某个成员变量值去做逻辑判断。但是在中间某个时机,另一个线程改变了这个成员变量的值,从而导致第一个线程的执行路径发生了变化
    • 我们已经知道了servlet是线程不安全的,给我们的启发是: 尽量的不要在servlet中定义成员变量。如果不得不定义成员变量,那么不要去:①不要去修改成员变量的值 ②不要去根据成员变量的值做一些逻辑判断

Http协议

  • HTTP:Hyper Text Transfer Protocol 超文本传输协议
  • Http是无状态的,包含 请求和响应 两个部分
  • Http请求报文包含三个部分:请求行、请求消息头、请求主题
    • 请求行:请求方式、访问地址URL、请求的协议(一般是http1.1)
    • 请求消息头:通过具体的参数对本次请求进行具体的说明,包含许多键值对
    • 请求体:① get方式,没有请求体,但有queryString ② post方式,有请求体 form data ③ json格式,有请求体,request payload
  • Http响应报文也包含三个部分:响应行、响应消息头、响应体
    • 响应行:协议、响应状态码、响应状态
    • 响应消息头:包含了服务器的信息;服务器发送给浏览器的信息(内容的媒体类型、编码、内容长度等)
    • 响应体:响应的实际内容(比如请求xxx.html页面时,响应的内容就是<html><head><body><form>)

会话Session

  • Http是无状态的:服务器无法判断这两次请求时同一个客户端发过来的,还是不同的客户端发过来的。
  • 带的问题:无法区分同一个用户,导致混乱
  • 通过会话跟踪技术来解决无状态问题
    • 客户端第一次发请求给服务器,服务器获取session,获取不到,则创建新的,然后响应给客户端
    • 下次客户端给服务器发请求时,会把sessionID带给服务器,那么服务器就能获取到了,那么服务器就判断这一次请求和上次某次请求是同一个客户端,从而能够区分开客户端
    • 常用的API:
      request.getSession() -> 获取当前的会话,没有则创建一个新的会话
      request.getSession(true) -> 效果和不带参数相同
      request.getSession(false) -> 获取当前会话,没有则返回null,不会创建新的
      session.getId() -> 获取sessionID
      session.isNew() -> 判断当前session是否是新的
      session.getMaxInactiveInterval() -> session的非激活间隔时长,默认1800秒
      session.setMaxInactiveInterval()
      session.invalidate() -> 强制性让会话立即失效
      session.getAttribute()/setAttribute(key,value),removeAttribute()
      ….
  • session保存作用域时和具体的某一个session对应的

服务器内部转发以及客户端重定向

  1. 服务器内部转发:request.getRequestDispatcher(“…”).forward(request,response);
    • 一次请求响应的过程,对于客户端而言,内部经过了多少次转发,客户端是不知道的
    • 地址栏没有变化
  2. 客户端重定向:response.sendRedirect(“…”);
    • 两次请求响应的过程。客户端肯定知道请求URL有变化
    • 地址栏有变化

Thymeleaf