Java - JavaWeb - Concepts

发布时间 2023-07-09 18:45:48作者: zjfun

1. Servlet配置

1.1. 配置父级项目

配置好Intellij IDEA/ MAVEN之后, 创建一个新项目 com.crevew.javaweb-02-servlet,然后删除所有的SRC(方便接下来创建servlet模块);然后更新最外面的父 pom.xml, 加上

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.crevew</groupId>
  <artifactId>Hello</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Hello Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

   <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>
  <build>
    <finalName>Hello</finalName>
  </build>
</project>

然后更新 web.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>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.crevew.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--一个servlet对应一个mapping-->
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>
  
</web-app>

1.2. 配置子级模块

1. 然后开始创建新的module,module选择 webapp, 框架 com.crevew.servlet01, 然后继续更新 web.xml (此时无需更新pom.xml文件)

2. 然后写servlet,然后编译 Tomcat发布。

注意事项:
Tomcat发布的时候,如果发现只有external source,没有artifact选项的话,那么重启intellij idea,然后rebuild  (就是 Build-> Rebuild Module),然后再试即可

 

2. Servlet对象   

2.1. Servlet对象

ServletContext: web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,这个对象代表了当前的web应用;这个servletContext管理这个web 应用下的所有servlets

可以实现以下功能:

  • 共享数据 (在两个servlets之间传递数据)
  • 获取初始化参数(在web.xml当中配置参数,然后通过servlet获取xml文件中配置的参数)
  • 请求转发  (从一个servlet 转发到另外一个servlet)

2.2. Properties文件

如果 src/main/java目录下的db.properties不能被正确导出,那么需要手动更改pom.xml文件,加入build的注意条件.

如果需要打包所有的properties文件,需要加入以下的代码,让maven知道所有的properties文件都需要打包

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>                
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

 

3. HttpServletResponse对象

3.1 Reponse 用途

负责向浏览器发送数据的方法:

ServletOutputStream getOutputStream() throws IOException;   日常流
PrintWriter getWriter() throws IOException;  写中文

负责向浏览器发送响应头的方法

    void setCharacterEncoding(String var1);
    void setContentLength(int var1);
    void setContentLengthLong(long var1);
    void setContentType(String var1);
  void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);

3.2. 常见应用:

3.2.1. 向浏览器输出消息;
3.2.2. 下载文件

  1. 要获取下载文件的路径
  2. 下载的文件名是什么
  3. 设置想办法让浏览器能够支持下载我们需要的东西
  4. 获取下载文件的输入流
  5. 创建缓冲区
  6. 获取OutputStream对象
  7. 将FileOutputStream流写入到缓冲区
  8. 使用OutputStream将缓冲区中的数据输出到客户端

3.2.3. 验证码功能

 验证码可以前段实现,也可以后端实现,此处为后端实现

3.2.4 实现重定向

4. HttpServletRequest对象

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http 请求中的所有信息都会被封装到HttpServletRequest中

4.1.1 Request主要用途

获取前端传递的参数

getParameter(String s);
getParameterValues(String s) String[];

 

4.1.2 请求转发

        //通过请求转发
        req.getRequestDispatcher("/Success.jsp").forward(req,resp);

另外两种转发方式,分别是:response转发,servlet转发
//        resp.sendRedirect("");
//        this.getServletContext()

 

请求转发 url不会产生变化 307代码; 请求重定向url会发生变化 302代码。以上其实都是重定向。

5. Session/Cookie

保存会话的两种技术:

  • Cookie: 客户端技术(响应/请求)
  • Session: 服务器技术,可以保存用户的会话信息

5.1 Cookie

从请求中拿到Cooike.

  • 一个cookie只能保存一个信息,
  • 一个web站点可以给浏览器发送多个cookies,
  • 每个站点最多存放20个cookie,
  • 每一个cookie大小限制4kb
  • 浏览器有300个cookie上限
        //Cookie, 服务器端从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
        //服务器端给服务端响应一个cookie
        Cookie cookie = new Cookie("lastLoginName", System.currentTimeMillis()+"");
        //Cookie有效期为一天
        cookie.setMaxAge(24*60*60);
        resp.addCookie(cookie);

删除cookie:

不设置有效期,关闭浏览器,自动失效
浏览器失效期设置为0

编码解码的代码如下

        URLEncoder.encode("字符","utf-8");
        URLDecoder.decode(cookie.getValue(),"utf-8");

 

 Session 

  • 服务器对于每一个用户(浏览器)创建一个session
  • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就一直存在
  • 用户登录之后,整个网站都可以访问(保存用户或者购物车信息)

Session失效的几种方法:

  • 浏览器关闭
  • 手动session.invalidate()失效
  • web.xml配置timeout时间

Session和Cookie区别

  • Cookie是把用户的数据写给用户的浏览器,用户浏览器保存 (可以保存多个)
  • Session是把用户的数据写到用户独占的Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
  • Session对象Object由服务端创建

创建: 有的时候,Cookie 服务器段创建最初值,发给客户端,Session客户端创建最初值,发给服务器端保存。(zjfun添加)

6.JSP

6.1 JSP 基本概念

JSP: Java Server Pages,最大的特点:写JSP就像是写HTML,但是区别是:HTML是静态数据,JSP中可以嵌入Java代码

  • JSP原理:代码层面没有任何问题,服务器内部,Tomcat当中有一个work目录,IDEA中使用Tomcat的会在IDEA的tomcat中产生一个目录C:\Users\zjfun\AppData\Local\JetBrains\IntelliJIdea2023.1\tomcat。
  • 浏览器向服务器发送请求,无论访问什么资源,其实都是在访问servlet;JSP最终也会被转换成一个java class;JSP本质上就是一个servlet
  • JSP的页面生成流程:判断请求,内置一些对象(Session,applicationContext,config,out,page等),输出页面前增加的代码(设置响应类型,session等)

     

 JSP的IDEA->MARVEN工程有两种途径创建:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>javaweb-jsp</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--Servlet 依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!--JSP 依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api -->
        <!--JSTL表达式的依赖-->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <!--Standard 标签库的依赖-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
    </dependencies>
</project>

 6.2 JSP基本语法与指令

6.2.1 JSP基本语法

Java所有语法都支持

  • <%=%> JSP表达式 (Java方法/函数)
  • <%%> JSP脚本片段/ 脚本片段的再实现 (Java代码段)
  • <%!%> JSP声明 (Java类声明) (会被编译到JSP生成的Java类中,其他的,就会被生成到_jspService方法中)
  • <%----%> JSP注释,JSP的注释不会在客户端显示

用EL (Express Language)会友善很多,而且EL表达式不会出现null等

6.3 JSP指令

<%@page ... %>   指定page用途; 注意: 404/500定制化错误页面,可以在出错的具体jsp页面上配置,也可以在web.xml里面统一配置
<%@include ...%>  包含页面,会将两个页面合二为一
<jsp:include page=.../> 相当于拼接页面,本质还是多个页面

    <%@include file="common/header.jsp"%>
    <h1>网页主体1</h1>
    <%@include file="common/footer.jsp"%>

    <%-- JSP标签 --%>
    <jsp:include page="/common/header.jsp"/>
    <h1>网页主体2</h1>
    <jsp:include page="/common/footer.jsp"/>

6.4 JSP 9大内置对象

  • pageContext, 存东西、取所有的东西;  请求转发
  • request,存东西  ; 客户端向服务器发送请求产生的数据,用户看完就没有用了,比如:新闻
  • response,
  • session, 存东西; 客户端向服务器端发送请求产生的数据,用户用完一会儿还有用,比如:购物车
  • application [ServletContext], 存东西; 客户端向服务器端发生产生的数据,一个用户用完了,其他用户还有用,比如:聊天数据,统计在线人数
  • config [ServletConfig]
  • out,页面输出
  • page,几乎不用
  • exception,和Java的异常一致

 

6.5 JSP标签、JSTL标签、EL表达式

EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用Java方法

 JSP标签 (几乎不用了)

<%--jsp:include--%>
<%--http://localhost:8080/jsptag.jsp?name=zjfun&age=12--%>
<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="zjfun"/>
    <jsp:param name="age" value="12"/>
</jsp:forward>

JSTL表达式: JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义了很多标签供我们使用,标签的功能和Java代码一样
包括:核心标签(掌握部分),格式化标签,SQL标签,XML标签。 详见: JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)

 

7 MVC

 

 Model: 

  • 业务处理: 业务逻辑(Service)
  • 数据持久层:CRUD (Dao)

View:

  • 展示数据
  • 提供连接发起Servlet请求(a. form, img...)

Controller (Servlet):

  • 接收用户的请求 (req. session)
  • 交给业务层处理对应的代码
  • 控制试图的跳转

 8 过滤器 Filter

过滤器和Servlet一模一样

    <filter>
        <filter-name>CharacterEncodingFileter</filter-name>
        <filter-class>com.crevew.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFileter</filter-name>
        <!-- 只要是/servlet的任何请求,都会经过这个过滤器 -->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

9 监听器 Listener

实现监听器接口即可

<!--注册监听器-->
    <listener>
        <listener-class>com.crevew.listener.OnelineCountListener</listener-class>
    </listener>

 

过滤器/监听器常见应用:

需求:用户登陆后才能进入主页;用户注销后就不能进入主页。
方案:可以让前端JSP实现 (通过前端看Session信息,和后端Servlet配合);最好通过Filter过滤器实现
实现:用户登录后, 向Session中放入用户的数据;进入主页的时候判断用户是否已经登录。

 

JDBC固定六部曲
加载驱动->连接数据库->向数据库发送Statement->编写SQL->执行SQL->关闭连接

10 SMBMS 超市管理系统

搭建:(14条消息) 【狂神javaweb(七)】项目实战-SMBMS-超市管理系统_smbms百度盘_xbd_zc的博客-CSDN博客

MySQL: smbms/smbms.sql at master · TongXueWen/smbms · GitHub

11 FileUpload