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. 下载文件
- 要获取下载文件的路径
- 下载的文件名是什么
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到缓冲区
- 使用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工程有两种途径创建:
- 方法一: 通过Marven-webapp建立
- 方法二:通过Marven-quickstart + Idea "Add Framework Support" 创建,创建后不能通过tomcat启动,需要增加这个配置 <packaging>war</packaging> 才可以;如果还是不行,请查阅下是否包括了index.jsp文件,按照这个文章(14条消息) 踩坑记录:IDEA web项目out artifacts文件夹只包含WEB-INF_out\artifacts_pokemonjs123的博客-CSDN博客 解决
<?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