首页 > 编程语言 >Java - JavaWeb - Concepts

Java - JavaWeb - Concepts

时间:2023-07-09 19:03:52浏览次数:47  
标签:web 浏览器 JavaWeb Session JSP Concepts Java servlet String

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

 

 

标签:web,浏览器,JavaWeb,Session,JSP,Concepts,Java,servlet,String
From: https://www.cnblogs.com/zjfun/p/17511166.html

相关文章

  • String内存模型和Java常用方法
    一、String内存模型1、直接赋值创建string对象内存原理:StringTable(串池):字符串常量池,用来存储字符串,只能是在直接赋值中使用才会存在串池当中(JDK7前串池是在方法区里面,StringTable(串池)在JDK7版本开始从方法区中挪到了堆内存,但是运行机制没有发生变化)eg:首先mian方法进栈,创建变......
  • 面试类-Java基础 (三)
    String是Java基本数据类型吗?可以被继承吗?String是Java基本数据类型吗?不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype),剩下的都是引用类型(referencetype)。String是一个比较特殊的引用数据类型......
  • 【java】虚拟机的内存划分
    为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。  区域名称作用程序计数器程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址本地方法栈当程序中调用了native的本地方法时,本地方法执行......
  • 【java】输入输出
    输出换行输出语句:输出内容后进行换行,格式如下:System.out.println(输出内容);//输出内容之后,紧接着换行不换行输出语句:输出内容后不换行,格式如下System.out.print(输出内容);////输出内容之后不换行 示例代码:publicclassTestPrintlnAndPrint{publicstaticvoid......
  • 【java】数据类型
    Java的数据类型分为两大类:基本数据类型:包括整数、浮点数、字符、布尔。引用数据类型:包括数组、类、接口、枚举、注解。   自动类型转换(1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时。inti='A';//char自动升级为int,其......
  • java日志框架
    发展简图历程:使用logback+slf4j进行日志框架处理,出自一人之手,衔接更好! logback官网手册(英文):https://logback.qos.ch/manual/index.htmllogback中文手册:http://www.logback.cn/博客中文手册:https://blog.csdn.net/qq_26462567/article/details/115757354 ......
  • 【java】源文件和类
    (1)源文件名是否必须与类名一致?public呢?如果这个类不是public,那么源文件名可以和类名不一致。但是不便于代码维护。如果这个类是public,那么要求源文件名必须与类名一致。否则编译报错。我们建议大家,不管是否是public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为......
  • JavaScript 模块
    JavaScript模块 一般来讲,模块是一个独立的JavaScript文件 模块文件可以包含一个类定义、一组相关的类、一个实用函数库或者是一些待执行的代码 以模块的形式编写代码,任何符合模块编码形式JavaScript代码段,都可当做一个模块JavaScript中未定义支持模块的语言结构,所以......
  • Java扩展Nginx之一:你好,nginx-clojure
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos关于Nginx扩展以欣宸自己为例,对一个java程序员来说,nginx并不陌生,下图应该是最常见的使用场景了,反向代理:除了反向代理,nginx的模块化机制让nginx具备了更多丰富的特性,例......
  • Java版归并排序 演示代码(带注释)
    Code:importjava.util.Arrays;/***归并排序*/publicclassMergeSort{/***私有化*/privateMergeSort(){}/***归并排序的sort方法*@paramarr待排序数组*@param<E>可比较的元素*/publicstatic<Eex......