华清远见重庆中心—JavaWeb技术总结/个人总结

本文总结了JavaWeb开发的核心知识点,包括网站和网页概念、Tomcat服务器的使用、Maven依赖管理、Servlet编写步骤、解决乱码问题、三层架构、JSP组成与动作、请求转发和重定向、Session与Cookie、过滤器Filter及其在面试中的常见问题。全面覆盖了JavaWeb开发的基础和实践技巧。
摘要由CSDN通过智能技术生成

JavaWeb

网站

用户通过浏览器访问某个域名或ip后,浏览到的综合性页面。

实际是发布在服务器上的一个应用程序,通过浏览器访问。

网页

网站中的某张页面

  • 静态页面:所有人看到的内容都一样

  • 动态页面:不同的人看到页面中的数据不一致

JavaWeb就是在B/S模式下,使用Java开发综合性web服务网站的技术。

网络服务器

部署web项目的平台

Tomcat

由Apecha、Sun公司及其他公司和个人共同开发的web服务器。

免费、开源、轻量级、在中小型系统中普遍使用。

是学习和开发web项目的首选服务器。

异步和同步:同步执行是指在执行程序时,一切程序按照流程顺序执行;异步是指多个线程同时执行。

Maven

用于管理项目的工具。如管理项目中所需的文件、打包项目等。

通过Maven项目中加入某个jar文件所诉的dependency(依赖),让其自动从MAven仓库中下载对应jar文件。

Maven依赖官网

地址https://mvnrepository.com/

导入所需依赖

在Maven依赖官网搜索对应依赖文件后选择版本,找到对应代码,粘贴到项目的pom.xml文件的dependencies标签中

easyexcel使用文档:https://easyexcel.opensource.alibaba.com/

读取Excel文件

//要读取的文件,必须存在
File file = new File("C:\\Users\\Administrator\\Desktop\\员工信息.xlsx");

// EasyExcel.read(要读取的文件,要读取的实体类.class,PageReadListener对象,参数为一个lambda表达式).sheet().doRead();
//PageReadListener对象需要设置泛型为要读取的实体类型,lambda表达式参数为读取到的数据集合
EasyExcel.read(file, Employee.class, new PageReadListener<Employee>((emps) -> {
    for (Employee emp : emps) {
        System.out.println(emp);
    }
})).sheet().doRead();

写Excel

//要写入的文件,可以不存在
File target = new File("d:\\employee.xlsx");

// EasyExcel.write(要写入的目标文件,要写入的实体类.class).sheet("表名").doWrite(要写入的数据集合)
EasyExcel.write(target, Employee.class).sheet("员工信息").doWrite(数据集合);

Tomcat

启动Tomcat

默认启动成功后会自动打开浏览器访问项目,也可以通过“localhost:8080/项目名”访问。

web资源目录结构

webapp下如果有index文件,访问项目后会自动访问index文件,如果没有名为index的文件,就会出现404,表示index页面不存在

项目上下文路径

域名+端口+项目名 称为项目上下文路径

如localhost:8080/web01就是项目上下文路径,可以理解为项目根目录

webapp目录直接通过项目上下文路径访问,无需显式写出

编写Servlet的步骤

1.在项目中导入Servlet所需依赖

<!-- servlet所需依赖 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.0</version>
    <scope>provided</scope>
</dependency>

粘贴在pom.xml文件中的dependencies标签下

2.在项目的java目录下,新建一个类,继承HttpServlet,重写doGet和doPost方法

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
​
/*
 * 编写Servlet的步骤
 * 1.导入依赖
 * 2.创建一个类,继承HttpServlet,重写doGet和doPost方法
 * 3.在web.xml中设置访问该类的url映射
 * */
public class FirstServlet extends HttpServlet {
    //普通的控制台项目,需要主动运行main方法执行程序
    //web项目中的java程序,需要被动运行,在用户通过浏览器访问某个程序的url映射时执行
​
    /*
     * 当浏览器发送的是get类型的请求,执行这个方法
     * */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("get请求");
    }
​
    /*
     * 当浏览器发送的是post类型的请求,执行这个方法
     * */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        System.out.println("post请求");
    }
}

3.在web.xml文件下,配置Servlet

<?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">
​
    <!--xml是一个配置文件,属于一种标记语言,通过标签定义内容-->
    <!--声明Servlet-->
    <servlet>
        <!--servlet命名-->
        <servlet-name>firstServlet</servlet-name>
        <!--servlet类的全限定名(路径+文件名)-->
        <servlet-class>FirstServlet</servlet-class>
    </servlet>
    <!--定义Servlet的请求映射-->
    <servlet-mapping>
        <!--要映射的servlet名,与上方定义的servlet-name一致-->
        <servlet-name>firstServlet</servlet-name>
        <!--请求映射url,必须以/开头-->
        <!--之后通过项目上下文路径+该路径,就能访问FirstServlet类-->
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
</web-app>

复制资源的相对路径

启动tomcat,访问"localhost:8080/项目路径/first"即可访问自定义servlet类中的doGet方法

解决tomcat控制台中输出中文时的乱码

三层架构

在软件开发中,并不是将所有的功能集成到一个类或文件中实现,而是要将其分层处理。从而达到"高内聚,低耦合"的目的。

低耦合是指降低各个模块之间的关联程度,便于开发和维护,各个模块各司其职。

高内聚指各个模块的功能不开再分。

通常所说的三层架构中的三层,指"数据访问层业务逻辑层视图表现层"

  • 数据访问层:用于连接操作数据库的类。对数据进行增删改查。

  • 业务逻辑层:用于处理业务逻辑,在适当的情况下访问数据访问层中的内容。

  • 视图表现层:用于展示和提供用户输入的渠道,在适当的情况下访问业务逻辑层中的内容

解决请求和响应时的中文乱码

public class MServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决请求时的乱码
        req.setCharacterEncoding("utf-8");
		//解决响应时的乱码
        resp.setContextType("text/html;charset=utf-8");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

HTTP状态码

常见状态码说明
200成功
404要访问的资源不存在
500服务器内部错误
405方法不允许

JSP

Java Server Pages

使用Java开发,运行在服务器上的页面,简称为JSP。JSP的后缀名为.jsp

JSP实际是一个Java类,具体为一个Servlet,第一次访问某个JSP页面,相当于编译运行Servlet,会慢一些。

访问JSP的流程:编译对应的Servlet-->运行Servlet。JSP的生命周期同servlet。

JSP的组成

1.HTML元素*

2.Java脚本*

<%
    java代码;
%>

3.表达式*

用于在页面中输出变量或字符串。

无需分号。

<%=变量%>

4.注释

jsp注释在访问jsp时不会在浏览器中看到

html注释在访问jsp时会再浏览器中看到

<%--注释--%>

5.指令

<%@ 指令名 属性="值"%>
  • page指令

    • 用于设置当前页面的属性

  • include指令

    • 用于嵌入其他页面

  • taglib指令

    • 用于导入其他标签库

6.声明

可以在这里定义方法、全局变量等

<%! 
    void fun(){}
%>

7.动作

使用标签定义一些功能。

<jsp:单词></jsp:单词> 
//包含另一张页面
<jsp:include page="路径"></jsp:include> 

请求转发和重定向

请求转发

request.getRequestDispatcher("目的路径").forward(request,response)
  • 使用请求转发跳转到目的地后,浏览器访问的地址栏是最初访问的路径
  • 可以在请求转发时,在Request对象中保存数据,如request.getParameter()、request.setAttribute()
  • 在执行查询时,通常将查询后的结果保存在request对象中后,使用请求转发跳转到页面中。

重定向

response.sendRedircet("目的路径")

使用重定向跳转到目的地后,浏览器的地址栏是最终访问的路径

如果在重定向时使用request对象保存数据,后续无法获取保存的内容

在执行增删改查后使用重定向跳转到目的地,防止重复提交

路径问题

绝对路径

完整路径

相对路径

  • /   从项目根目录出发,即域名+端口号
  • ./  从当前位置出发
  • ../退出当前目录后出发

Ajax

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

任何的浏览器都支持ajax。通过原生的js使用ajax极不方便,这里使用jquery封装后的ajax使用

## 使用

1.在页面中引入jquery文件

```html
<script src="jquery文件路径"></script>

2.给某个节点绑定事件后使用ajax提交数据

<script>
	$("#btn").click(()=>{
        $.ajax({
            //访问的地址
            url:'URL地址',
            //提交的数据,以键值对的形式提交,也可以提交单个数据
            data:{
                id:123,
                op:"xxx"
            },
            //提交方式
            type:"post",
            //访问成功后的回调函数
            succuss:(res)=>{//res为访问URL地址后的返回值
                
            },
            //访问失败后的回调函数
            error:(res)=>{}
        });
    });
</script>

登出

case "logout":
    //销毁session
    session.invalidate();
    //跳转登录页
    resp.sendRedirect("/book_shop/pages/login.html");
break;

EL

Expression Language 表达式语言

是为了使JSP中的输出写起来更加简便,替换JSP中的<%=%>,即表达式。

主要输出保存在某个作用域中的数据。

特点

  • 减少代码(获取对象、转换对象、获取对象属性)

    • 如果通过"某个作用域对象.setAttribute(String str,Object obj)"方法保存的对象,

      在JSP页面中,如果用表达式,写为<%=str>;如果使用EL,写为${str}。

      会依次从pageContext-->request-->session-->application中获取指定对象,如果一旦从某个作用域中获取到了对象,就不再判断后续作用域。

      也可以指定从某个作用域中获取对象,如${session.str}表示从session作用域中获取对象。

  • 免去非空判断

    • 如果要使用的某个对象不存在,不会输出null,而是输出空字符串""

使用

1.获取保存在作用域中的对象

  • 获取保存在某个作用域中的对象:${对象名}

  • 从指定的作用于中获取对象

    作用域单词对应作用域代码
    pageScope当前页pageContext${pageScope.对象}
    requestScope请求request${requestScope.对象}
    sessionScope会话session${sessionScope.对象}
    applicationScope项目application${applicationScope.对象}
  • 输出对象的属性

    ${对象名.属性名}   
    ${对象名["属性名"]}    
    ​
    要保证该属性有对应的get方法    
  • 输出对象的方法返回值

    ${对象名.方法名()}   

2.用户获取当前项目上下文路径(根目录+项目名)

http://localhost:8080/book_shop是一个项目上下文路径。

在JSP中使用${pageContext.request.contextPath}获取项目上下文路径

3.在页面中获取请求中携带的参数

可以使用EL获取表单提交或地址中?后传递的数据

使用${param.参数}表示request.getParameter("参数")方法获取的数据

<form action="xxx.jsp">
    <input type="text" name="username">
    <input type="submit">
</form>
​
<a href="xxx.jsp?username=admin"></a>

在xxx.jsp中

${param.username}获取提交的数据

注意

  • web.xml版本在4.0之后,在JSP中使用EL时,默认可以识别。

  • 如果JSP中无法识别EL,原样输出${}符号时,在指令(<%@ %>)中加入 isELIgnored="false" 表示不忽略EL

    <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
  • 如果在使用EL的过程中,出现PropertyNotFoundException异常,表示未发现指定属性,原因有

    • 缺少指定属性

    • 指定属性没有对应的get方法

JSTL

Java Server Page Standarded Tag Library JSP标准标签库

可以使用JSTL中的特定标签,来替换JSP中常见的java代码,如循环判断等。减少JSP中的java代码,提高页面的可读性。

使用

  • 导入jstl依赖

    <!-- jstl -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
  • 在JSP页面中,加入标签库指令

    <!--在当前页面中使用jstl,以c为标签前缀-->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

    这句话可以在使用循环时自动生成

  • 具体使用

    • 定义变量或给变量赋值

      <c:set var="变量名" value="值"></c:set>
      <c:set var="name" value="admin"></c:set>
    • if判断

      <c:if test="判断条件">
          满足时执行
      </c:if>
      ​
      session.setAttribute("user",用户对象);
      ​
      <c:if test="${empty user}">
          <span>请登录</span>
      </c:if>
      ​
      <c:if test="${!empty user}">
          <span>${user.username}</span>
      </c:if>
    • 遍历List集合

      //如在servlet中,将查询到的集合保存在request对象中
      request.setAttribute("list",查询到的集合)
      <table>
          <!--<c:forEach items="要遍历的集合" var="遍历出的每个对象">-->
          <c:forEach items="${list}" var="obj"> 
              <tr>
                  <td>${obj.属性}</td>
              </tr>
          </c:foreach>
      </table>
    • 遍历Map集合

      <%
          HashMap<String,String> hm = new HashMap();
          hm.put("yyds","永远单身");
          hm.put("awsl","阿伟死了");
          hm.put("u1s1","有一说一");
          application.setAttribute("hm",hm);
      %>
      <c:forEach items="${hm}" var="kv">
          <%--${键值对.key} 获取键   ${键值对.value} 获取值   --%>
          <h2>${kv.key}--${kv.value}</h2>
      </c:forEach>

JSP内置对象

在JSP中,可以不用定义,就能直接使用的对象,称为内置对象。

一共有9个内置对象

"rrppsoace"

  • pageContext

    作用域对象,当前页面作用域。

  • request

    作用域对象,请求作用域。

  • session

    作用域对象,会话作用域。

  • application

    作用域对象,项目作用域。

  • response

    响应对象

  • out

    输出对象,相当于Servlet中的response.getWriter()方法的返回值对象

  • page

    表示当前页面自身对象,相当于servlet中的this

  • config

    配置对象,获取servlet的配置信息

  • exception

    异常对象,只能使用在有isErrorPage="true"声明的jsp页面中,用于获取异常对象

Session和Cookie

session

session称为会话,是一个作用域,使用session.setAttribute()保存数据,使用session.getAttribute()获取数据。

默认session会话有效期为30分钟,可以更改,超时或关闭浏览器,session失效。

保存在session中的数据,可以在同一个站点下的不同页面中共享。

session共享数据的原理

  • 访问任意JSP页面时,默认都会创建一个JSESSIONID(可以取消自动创建),是一段session编号,保存在一个cookie文件中

    <%--所有jsp页面中,默认开启了session--%>
    <%@ page session="true"%>
    ​
    <%--让页面默认不使用session--%>
    <%@ page session="false"%>

    自动生成的cookie文件信息,可以看出,随着浏览器关闭,session到期

设置项目全局session有效时长

在web.xml文件中设置,单位为分钟

<!--设置项目中所有session的有效时长,单位分钟-->
<session-config>
    <session-timeout>5</session-timeout>
</session-config>

cookie

cookie是一个用于保存数据的对象,实际是一个保存在客户本地的文件。关闭浏览器,cookie依然存在。手动清理或自动超时清理后,数据随之消失。

cookie通常用于更久地保存数据,即便关闭浏览器,也能一直存在。如登录信息、购物车信息等

cookie中保存的数据有上限(4kb),

cookie在浏览器中保存的数量也有上限(30~300根据浏览器不同略有变化)。

创建cookie

//Cookie(String name,String value);
Cookie ck = new Cookie("str","hello");
//设置有效时长,单位为秒,如果不设置,关闭浏览器,cookie失效
ck.setMaxAge(7*24*3600);//7天

保存cookie

response.addCookie(ck);

遍历cookie

Cookie[] cks = request.getCookies();
for(Cookie ck : cks){
    ck.getName();//获取name
    ck.getValue();//获取value
}

过滤器Filter

是一个特殊的servlet

使用

1.新建一个类,继承HttpFilter

2.重写doFilter()方法,设置过滤条件

package com.hqyj.book_shop.filter;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
 * 自定义过滤器
 * 1.创建一个类,继承HttpFilter
 * 2.重写受保护的doFilter方法
 * 3.配置过滤器
 * */
public class MyFilter extends HttpFilter {

    @Override
    protected void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
        //获取当前访问的uri(地址)
        String uri = req.getRequestURI();
        System.out.println(uri + "访问过滤器");
        //如果登录成功后,session会保存customer。
        //过滤器中判断当前session中是否存在customer
        if (req.getSession().getAttribute("customer") != null) {
            chain.doFilter(req, res);
            return;
        }
        //如果session中没有customer,只能放行登录、注册页及其相关静态资源和customer模块
        if (uri.contains("html")  || uri.contains("jquery")|| uri.contains("customer")) {
            chain.doFilter(req, res);
        }else{
            //否则跳转登录页
            res.sendRedirect("http://localhost:8080/book_shop/pages/login.html");
        }
    }
}

3.配置过滤器,过滤一切请求

<!--声明一个过滤器-->
<filter>
    <!--过滤器名,无限制-->
    <filter-name>myFilter</filter-name>
    <!--过滤器类全限定名-->
    <filter-class>com.hqyj.book_shop.filter.MyFilter</filter-class>
</filter>
<!--配置过滤器映射-->
<filter-mapping>
    <!--过滤器名,与上方对应-->
    <filter-name>myFilter</filter-name>
    <!--过滤一切请求-->
    <url-pattern>/*</url-pattern>
</filter-mapping>

面试相关

  • getpost的区别?

表单如果是get提交,无法在action中使用?提交数据。表单如果是post方式提交,可以在action中使用?提交数据。get提交的参数在URL中可以看到,post通过HTTP请求体提交参数,在URL中不能看见。post方式更加安全。

  • servlet的生命周期?

Servlet生命周期可以被定义为从创建直到销毁的整个过程

构造方法一次-->init()一次-->service()-->destory()一次

在第一次访问某个Servlet时,执行

1.构造方法一次

2.init()一次

3.有service()方法执行service()方法,没有则执行doxxx()方法没如果都没有,报405状态码,表示请求不允许

4.当服务停止时,执行destroy()方法一次

  • Tomcat默认端口号是多少?怎么改端口号?

Tomcat默认端口是8080。在目录C:\\Windows\System32\drivers\etc中的hosts文件中,更改端口号。

  • SessionCookie的区别?

(1)session中保存的数据类型可以是任意类型,没有大小限制;Cookie中保存的是键值对,单个值大小上限位4kb。

(2)Session中保存的数据存在服务器端,Cookie中保存的数据存在浏览器中。

(3)Session到期或随着浏览器关闭而失效,Cookie如果设置了有效时长,即使关闭浏览器也会存在,在到期或手动清理后失效。

  • 重定向与转发的区别?

1.定义不同。请求转发(Forward):发生在服务端程序内部,当服务器端收到一个客户端的请求之后,会先将请求发给目标地址,再将目标地址返回的结果转发给客户端。张三(客户端)找李四(服务器端)借钱,而李四没钱,于是李四又去王五那借钱,并把钱借给了张三,整个过程中张三只借了一次款,剩下的事情都是李四完成的,这就是请求转发

请求重定向(Redirect):请求重定向指的是服务器端接收到客户端的请求之后,会给客户端返回一个临时响应头,这个临时头中记录了客户端需要再次发送请求(重定向)的URL地址,客户端在收到地址之后,会将请求发送到新的地址上。张三(客户端)找李四(服务器端)借钱,李四没钱,于是李四就告诉张三,“我没钱,你去王五那借“,于是张三又去王五家借到了钱,这就是请求重定向。

2.请求方式不同

请求转发是服务器端的行为,服务器端代客户发送请求,再将结果返回给客户端;而重定向是客户端的行为

3.数据共享不同

请求转发一次共享数据,重定向不共享数据

4.最终URL地址不同

请求转发的URL地址是不变的;而请求重定向的地址是发生改变的

Session和Cookie的区别

  • Session保存在服务器中,Cookie保存在浏览器(客户端)中。
  • session中保存的数据类型可以是任意的,没有大小限制;Cookie中保存的是键值对,单个值上限为4kb。
  • session到期或者随着浏览器关闭而失效,Cookie如果设置了有效时长,及时关闭浏览器也会存在,在到期或手动清理时失效。

JSP内置对象有哪些?

在JSP中,可以不用定义就能直接使用的对象,称为内置对象。

“rrppsoace”

response  响应对象

request  请求作用域  作用域对象

pageContext  当前页面作用域  作用域对象

page  当前页自身对象,表示当前Servlet中的this

session 会话作用域 作用域对象

out  输出对象,相当于Servlet中的response.getWriter()方法返回值对象

application 项目作用域  作用域对象

config  配置对象,获取Servlet的配置信息

exception 异常对象,只能使用在有isErrorPage=“true”声明的JSP页面中,用于获取异常对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值