JavaWeb概览
Internet上供外界访问的Web资源分为:静态web资源(如html页面)和动态web资源。静态web资源开发技术:HTML、CSS。动态web资源开发技术:JavaScript、JSP/Servlet、ASP、PHP等。在Java中,动态web资源开发技术统称为Java Web。基本框架包括使用Servlet或者Filter拦截请求,使用MVC的思想设计架构,使用约定,XML或 Annotation实现配置,运用Java面向对象的特点,面向对象实现请求和响应的流程,支持Jsp,Freemarker,Velocity等视图。
基本概念
1.静态Web
缺点:
- Web页面无法动态更新
- 伪动态
- JavaScript
- VBScript
- 无法与数据库交互
2.动态Web
Web服务器
1.ASP
ASP(Active Server Pages),Microsoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序。除服务器端脚本代码外,ASP文件也可以包含文本、HTML和com组件调用。通过ASP,可以结合HTML网页、ASP指令和ActiveX组件创建动态、交互且高效的WEB服务器应用程序。同时,ASP也支持VBScript和JScript等脚本语言,默认为VBScript,而其中JScript是微软公司的ECMAScript标准的实现,并且有自己的扩展。
1 | <!DOCTYPE html> |
2.PHP
PHP(Hypertext Preprocessor)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面,但PHP也被用于其他很多领域。
1 | <!DOCTYPE html> |
3.JSP/Servlet
JSP(Jakarta Server Pages)是由Sun公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
B/S: browser server
C/S: client server
1 | <html> |
1.Tomcat
Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台和Tomcat阀等。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。Apache Tomcat包含了配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。
2.IIS
互联网信息服务(Internet Information Services),是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。IIS包括FTP/FTPS、NNTP、和HTTP/HTTPS、SMTP等服务。IIS可设置的内容包括:虚拟目录及访问权限、默认文件名称、以及是否允许浏览目录。
Tomcat
1.Tomcat目录
目录及文件 | 说明 |
---|---|
bin | 用于存放Tomcat的启动、停止等批处理脚本和Shell脚本 |
bin/startup.bat | 用于Windows下启动Tomcat |
bin/startup.sh | 用于Linux下启动Tomcat |
bin/shutdown.bat | 用于Windows下停止Tomcat |
bin/shutdown.sh | 用于Linux下停止Tomcat |
conf | 用于存放Tomcat的相关配置文件 |
conf/Catalina | 用于存储针对每个虚拟机的Context配置 |
conf/context.xml | 用于定义所有Web应用均需要加载的Context配置,如果Web应用指定了context.xml,该文件配置将被覆盖 |
conf/catalina.properties | Tomcat环境变量配置 |
conf/catalina.policy | 当Tomcat在安全模式下运行时,此文件为默认的安全策略配置 |
conf/logging.properties | Tomcat日志配置文件,可修改Tomcat日志级别以及日志路径等 |
conf/server.xml | Tomcat服务器核心配置文件,用于配置Tomcat的链接器、监听端口、处理请求的虚拟主机等。 |
conf/tomcat-users.xml | 用于定义Tomcat默认用户及角色映射信息,Tomcat的Manager模块即用该文件定义的用户进行安全认证 |
conf/web.xml | Tomcat所有应用默认的部署描述文件,主要定义了基础Servlet和MIME映射 |
lib | Tomcat服务器依赖库目录,包含Tomcat服务器运行环境依赖Jar包 |
logs | Tomcat默认的日志存放目录 |
webapps | Tomcat默认的Web应用部署目录 |
work | Web应用JSP代码生成和编译临时目录 |
2.测试启动
3.默认端口
- Tomcat:8080
- Mysql:3306
- http:80
- https:443
4.IDEA配置Tomcat
IDEA:Ultimate版本(收费,支持Web开发:Tomcat)\Community版(开源免费)
1.Run->Run/Debug Configurations->Tomcat(Local)->HTTP port:8080
2.Edit Configurations -> Tomcat ->Deployment->Add(需要运行项目war)
3.Edit Configurations -> Tomcat ->Deployment->Application context(项目初始路径名)
5.Application Server not specified
关联本地的tomcat:Application sever选择本地Tomcat安装路径
6.No artifacts marked for deployment
Fix->war
7.IDEA tomcat 热部署(修改jsp文件)
1.下方Services->Deploy All
2.修改Tomcat配置On’Update’action\On frame deactivation -> Update classes and resources
8.IDEA下方Services中Tomcat localhost Log可查看Tomcat报错信息。
关于Tomcat10 Maven依赖问题
From the Tomcat 10.0.0-M1 release announcement:
Users of Tomcat 10 onwards should be aware that, as a result of the move from Java EE to Jakarta EE as part of the transfer of Java EE to the Eclipse Foundation, the primary package for all implemented APIs has changed from javax.*
to jakarta.*
. This will almost certainly require code changes to enable applications to migrate from Tomcat 9 and earlier to Tomcat 10 and later.
1 | <dependency> |
That is never going to work on Tomact 10. You can’t use Java EE 8 libraries with a Jakarta EE 9 server.
1.如果你无法处理这之间的关系,推荐仍然使用Tomcat9(Spring仍然无法兼容Tomcat10).
2.2015年,Tomcat 8开始支持 JavaEE8,javax 项目由 Sun 公司转给 glassfish 维护运营,相应地被拆分为jakarta多个项目,但这并不能说明仅仅将javax替换成jakarta即可。
HTTP
1.协议版本
- HTTP/0.9
HTTP/0.9只支持GET方法,不支持多媒体内容的MIME类型、各种 HTTP首部,或者版本号
- HTTP/1.0
1.0是第一个得到广泛使用的HTTP版本。HTTP/1.0添加了版本号、各种 HTTP首部、一些额外的方法,以及对多媒体对象的处理。HTTP/1.0使得包含生动图片的Web页面和交互式表格成为可能。
- HTTP/1.0+
HTTP中添加各种新特性,包括持久的keep-alive 连接、虚拟主机支持,以及代理连接支持都被加入到HTTP之中,并成为非官方的事实标准。
- HTTP/1.1
HTTP/1.1重点是校正HTTP设计中的结构性缺陷,明确语义,引入重要的性能优化措施,并删除一些不好的特性,包含了对20世纪 90年代末正在发展中的更复杂的Web应用程序和部署方式的支持。
- HTTP/2.0(HTTP-NG)
HTTP/2支持请求与响应的多路复用减少延迟,压缩HTTP首部字段降低协议开销,增加对请求优先级和服务器端推送的支持。
Maven
Apache Maven,是一个软件项目管理及自动构建工具,由Apache软件基金会所提供。基于项目对象模型(POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。Maven也可被用于构建和管理各种项目,例如C#,Ruby,Scala和其他语言编写的项目。Maven曾是Jakarta项目的子项目,现为由Apache软件基金会主持的独立Apache项目。
Maven不仅是构建工具,还是一个依赖管理工具(第三方的开源类库,通过一组坐标Maven能够找到任何一个Java类库,如jar文件)和项目信息管理工具。它提供了中央仓库,可以自动下载构件。
1.下载安装
2.配置环境变量
1 |
|
1 | mvn --version |
3.配置镜像
1 | <!--conf\settings.xml--> |
4.配置本地仓库(localRepository)
1 | <!--conf\settings.xml--> |
5.IDEA/Maven
1.New Project->Maven->Create from archetype(maven-archetype-webapp)->next->Artifact Coordinates(Groupld/Artifactld)->Maven home path/User settings file/Local resposity-> BUILD SUCCESS
2.New Project->Maven->右键项目名->Add Frameworks Support->Java EE(Web Application)
- New->Maven->Next->rtifact Coordinates(Groupld/Artifactld)->Finish
- File->Build,Execution,Deployment->Build Tools->Repositories
- Build->Fresh图标
3.新建Empty Project->(File->Project Structure )Project SDK(1.8)/Java Project language level(SDK default)->File->New Module->Java (Web Application/Maven webapps)
- 如无Web Application可新建一个空Module之后右击项目Add Framework Support选择Web Application即可
- 可在本项目中File->New Module新建另一个项目
4.当前工程右击new Module新建子工程即可继承父pom.xml导入的依赖。
通常无法找到对应库或者依赖需要在File->Project Settings->Artifacts->WEB-INF文件夹下新建lib文件夹->点击+号添加Library文件即可
1.IDEA创建maven项目后无.iml文件
在IDEA terminal:mvn idea:module
2.webapp版本与tomcat一致(webapp/WEB-INF/web.xml)
3.依赖爆红:
- File->Settings->Build,Execution,Deloyment->Build Tools->Maven(Maven home path/User settings file/Local repository)是否为本地安装目录->Invalidate Caches
- 在Maven Repository中下载Jar包至Maven指定本地仓库
- 在Maven中刷新即可
4.修改maven的编码格式为utf-8:
mvn -v:默认编码为GBK
设置环境变量:
变量名 MAVEN_OPTS
变量值 -Xms256m -Xmx512m -Dfile.encoding=UTF-8
1 |
|
6.POM(Project Object Model项目对象模型
Maven项目的核心是pom.xml
1 | <!--该xml文档的版 |
1 | /* HelloServlet.java*/ |
1 | <!--header.html--> |
1 | <!--pom.xml--> |
1 | <!--Webapp/WEB-INF/web.xml--> |
默认index.jsp生成页面
/header.html header.html
/test HelloServlet.java生成页面
注意:访问HelloServlet.java生成页面报500时,下载tomcat9在IDEA中重新Edit Configurations一个Tomcat9的配置运行该项目即可(或者使用Tomcat10的配置依赖)。
Servlet
1.Servlet(Java Servlet)是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。
2.Servlet接口-实现->GenericServlet类-继承->HttpServlet类
1.配置依赖(Tomcat9 10使用的依赖存在区别,注意区分)
Tomcat10
1 | <!--pom.xml--> |
Tomcat9
1 | <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> |
1.依赖变红一般检查idea的maven配置,查看maven软件、配置文件和本地仓库的配置(Settings->Build,Execution,Deployment->Maven)
2.下载的依赖都在定义maven的本地仓库中查看。
3.Maven Project右键Module新建子工程。
- 父项目
1 | <modules> |
- 子项目
1 | <parent> |
无父节点<parent></parent>手动添加即可。
1 | public interface Servlet { |
1 | //HelloServlet.java |
1 | <!--Web.xml--> |
Mapping
1.一个Servlet指定一个映射路径。
1 | <servlet-mapping> |
2.一个Servlet指定多个映射路径。
1 | <servlet-mapping> |
3.一个Servlet可以指定通用映射路径。
1 | <servlet-mapping> |
4.默认请求路径
1 | <servlet-mapping> |
5.指定前缀或后缀(*前不能加项目映射路径)
1 | <servlet-mapping> |
1 | package com.noob; |
1 | <!-- 明确指定的映射路径优先级最高--> |
ServletContext
web容器在启动时会为每个web程序创建一个对应的ServletContext对象,代表当前的web应用。
1.共享数据
访问hello页面为username赋值,之后访问get页面即可。
1 | package com.noob.Servlet; |
1 | package com.noob.Servlet; |
1 |
|
2.获取初始化参数
1 | package com.noob.Servlet; |
1 | <context-param> |
3.请求转发
1 | package com.noob.Servlet; |
1 | <servlet> |
4.读取资源文件
Properties:properties都被打包到同一路径:classes,即classpath。
1 | package com.noob.Servlet; |
1 | <servlet> |
1 | #db.properties |
HttpServletResponse
web服务器在接受到客户端的HTTP请求时,针对该请求会分别创建一个代表请求的HttpServletRequest对象(可获取客户端的请求参数)以及一个代表响应的HttpServletResponse对象(可发送给客户端的响应信息)。
1.向浏览器发送数据
1 | ServletOutputStream getOutputStream() throws IOException; |
2.向浏览器发送响应头
1 | void setCharacterEncoding(String var1); |
3.响应状态码
1 | int SC_CONTINUE = 100; |
1.应用
- 向浏览器输出信息
- 下载文件
1 | package com.noob; |
1 | <servlet> |
- 验证码
1 | package com.noob; |
1 | <servlet> |
- 重定向
1 | package com.noob; |
1 | package com.noob; |
1 | <%-- |
1 | <%-- |
1 | <servlet> |
HttpServletRequest
HttpServletRequest代表客户端的请求,当用户通过HTTP请求访问服务器时,HTTP请求的所有信息会被封装到HttpServletRequest。
1.获取前端传递的数据
1 | String getParameter(String var1); |
1 | package com.noob.servlet; |
1 |
|
1 | <%-- |
1 | <%-- |
1 | <!-- pom.xml --> |
Cookie
Cookie(Cookies),类型为"小型文本文件",指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。Cookie保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。内存 Cookie 由浏览器维护,保存在内存中,浏览器关闭即消失,存在时间短暂。硬盘Cookie保存在硬盘里,有过期时间,除非用户手动清理或到了过期时间,硬盘Cookie不会清除,存在时间较长。所以,按存在时间,可分为非持久Cookie和持久Cookie。因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。服务器可以设置或读取Cookie中包含的信息,借此维护用户跟服务器会话中的状态。
1.Google Chrome C:\Users%USERNAME%\AppData\Local\Google\Chrome\UserData\Default\
Microsoft Edge C:\Users\29921\AppData\Local\MicrosoftEdge
2.一个Cooike只能保存一个信息,一个Web站点可向浏览器发送多个Cookie,最多存放20个Cookie,Cookie大小限制为4kb。
3.Cookie删除
- 不设置有效期,关闭浏览器,Cookie失效
- 设置有效期为0
1 | package com.noob.Cookie; |
1 | package com.noob.Cookie; |
1 | package com.noob.Cookie; |
Session
1.会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制,session在网络协议(如telnet或FTP)中是非常重要的部分。在不包含会话层(如UDP)或者是无法长时间驻留会话层(如HTTP)的传输协议中,会话的维持需要依靠在传输数据中的高级别程序。例如,在浏览器和远程主机之间的HTTP传输中,HTTP cookie就会被用来包含一些相关的信息,例如session ID,参数和权限信息等。
2.Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话。
1.作用范围:Cookie 保存在客户端(浏览器),Session保存在服务器端。
2.存取方式:Cookie 只能保存ASCII,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说UserId 等。
3.有效期不同,Cookie可设置为长时间保持,比如我们经常使用的默认登录功能,Session一般失效时间较短,客户端关闭或者Session超时都会失效。
4.隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对Cookie 要好一些。
5.存储大小不同,单个Cookie保存的数据不能超过 4K,Session可存储数据远高于Cookie。
1 | package com.noob.Cookie; |
1 | package com.noob.Cookie; |
1 | package com.noob.Cookie; |
1 | package com.noob.Cookie; |
1 |
|
JSP
JSP与PHP、ASP、ASP.NET等语言类似,运行在服务端的语言,由 Sun Microsystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。JSP文件后缀名为*.jsp
。
原理
JSP最终会被转换为一个Java类编译为class文件被用户访问(本质是一个Servlet)。
1 | // |
1.index.jsp->index_jsp.java
C:\Users\yourUserName\AppData\Local\JetBrains\IntelliJIdea2021.2\tomcat
example.jsp->example_jsp.java
1 | <!--import org.apache.jasper.runtime.HttpJspBase; --> |
1 | <html> |
1 | /* |
1 | <html> |
1 | /* Code */ |
基础语法
1.脚本程序
可以包含任意量的Java语句、变量、方法或表达式:
1 | <% 代码片段 %> |
等价的XML语句:
1 | <jsp:scriptlet> |
2.JSP表达式
1.一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
2.由于表达式的值会被转化成String,所以可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
3.表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
1 | <%= 表达式 %> |
等价的XML语句:
1 | <jsp:expression> |
3.JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用(转换到JSP生成的Java类中,而非JSP生成的Java类中的_jspService方法)。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。
1 | <%! declaration; [ declaration; ]+ ... %> |
或者,您也可以编写与其等价的XML语句,就像下面这样:
1 | <jsp:declaration> |
4.JSP注释
JSP注释主要有两个作用:为代码作注释以及将某段代码注释掉。
语法 | 描述 |
---|---|
<%– 注释 --%> | JSP注释,注释内容不会被发送至浏览器也不会被编译 |
<!– 注释 --> | HTML注释,通过浏览器查看网页源代码时可看到注释内容 |
5.JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
1 | <%@ directive attribute="value" %> |
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
- web/index.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- web/hello.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- web/test.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- web/error/404.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- web/error/error.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- web/common/footer.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- web/common/header.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 |
|
内置对象与作用域
JSP支持九个自动定义的变量(隐含对象)
对象 | 描述 |
---|---|
request | HttpServletRequest类的实例 |
response | HttpServletResponse类的实例 |
out | PrintWriter类的实例,用于把结果输出至网页上 |
session | HttpSession类的实例 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
page | 类似于Java类中的this关键字 |
exception | exception 类的对象,代表发生错误的 JSP 页面中对应的异常对象 |
1.JSP中的四种作用域包括page、request、session和application。
2.page代表与一个页面相关的对象和属性。request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域 session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | <%--pageContextDemo2.jsp--%> |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
request对象是javax.servlet.http.HttpServletRequest类的实例。每当客户端请求一个页面时,JSP引擎就会产生一个新的对象来代表这个请求。
request对象提供了一系列方法来获取HTTP信息头,包括表单数据,cookies,HTTP方法等等。
常用的获取HTTP信息头的方法:
String getContextPath():返回request URI中指明的上下文路径
String getParameter(String name):返回此request中name指定的参数,若不存在则返回null
Cookie[] getCookies():返回客户端所有的Cookie的数组
Object getAttribute(String name):返回名称为name的属性值,如果不存在则返回null
2.HttpServletResponse类
response 对象是 javax.servlet.http.HttpServletResponse 类的一个实例。就像服务器会创建request对象一样,它也会创建一个客户端响应。
response对象定义了处理创建HTTP信息头的接口。通过使用这个对象,开发者们可以添加新的cookie或时间戳,还有HTTP状态码等等。
常用的用来设置HTTP响应头的方法:
- void addCookie(Cookie cookie):添加指定的cookie至响应中
- void sendRedirect(String location):使用指定的URL向客户端发送一个临时的间接响应
- void setContentType(String type):设置响应的内容的类型,如果响应还未被提交的话
JSTL EL
1.JSP标签
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
2.JSP 标准标签库(JSTL)
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
1.核心标签
2.格式化标签
3.SQL标签
4.XML标签
5.JSTL函数
1 | <!-- JSTl表达式依赖 --> |
核心标签是最常用的JSTL标签。引用核心标签库:
1 | <"c" uri="http://java.sun.com/jsp/jstl/core" > @ taglib prefix= |
Tomcat导入爆红未导入taglibs-standard-impl包,可参考下问题同时解决。
1 | 解决org.apache.jasper.JasperException:The absolute uri: http://java.sun.com/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application问题(该URI适用JSTL 1.0,而非JSTL 1.2) |
->Tomcat10+上安装JSTL(参考)
1 | <dependency> |
也可以/WEB-INF/lib
Web项目的文件夹中或者Tomcat10的apache-tomcat-10.0.12/lib
实现相同效果
->Tomcat9-上安装JSTL
1 | <dependency> |
也可以/WEB-INF/lib
Web项目的文件夹中或者Tomcat10的apache-tomcat-9.0.54/lib
实现相同效果
->确保web.xml版本正确
- Servlet 5.0 (Tomcat 10) 兼容:
1 |
|
- Servlet 4.0 (Tomcat 9)
1 |
|
标签 | 描述 |
---|---|
<c:out> | 在JSP中显示数据,就像<%= … > |
<c:set> | 保存数据 |
<c:remove> | 删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 在一般使用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
1 | <%--coreif.jsp--%> |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> |
3.EL
表达式语言(Expression Language,EL表达式,简称EL),是Java中的一种特殊的通用编程语言,借鉴于JavaScript和XPath。主要作用是在Java Web应用程序嵌入到网页(如JSP)中,用以访问页面的上下文以及不同作用域中的对象,取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。
- 以
${
开始,以}
作为结束:
1 ${EL表达式}
- 获取某对象的值可以直接写入对象的名称,如获取对象名为"user"的对象的值:
1 ${user}
- 获取某对象的属性的值使用点操作符(
.
操作符),如获取对象user的name属性和age属性的值的语法如下:
1
2 ${user.name}
${user.age}
JavaBean
JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。(一般用于和数据库的字段做映射 ORM[表->类 字段->属性 行行为->对象])
people表
id | name | age | address |
---|---|---|---|
1 | Jack | 12 | 北京 |
2 | Tom | 23 | 西安 |
3 | John | 24 | 成都 |
1 | class People{ |
1 | package com.noob.Cookie; |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
->报500错误重新新建Webapp项目即可
MVC
MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。MVC模式最早由Trygve Reenskaug在1978年提出,是施乐帕罗奥多研究中心(Xerox PARC)在20世纪80年代为程序语言Smalltalk发明的一种软件架构。MVC模式的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式透过对复杂度的简化,使程序结构更加直观。软件系统透过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。
1.模型(Model)-程序员编写程序应有的功能(实现算法等 业务逻辑 Service)、数据库专家进行数据管理和数据库设计(可以实现具体的功能 CRUD)。
2.视图(View)-界面设计人员进行图形界面设计。
3.控制器(Controller)-负责转发请求,对请求进行处理,控制视图跳转。
Filter
1.Filter(过滤器),通过Filter可以拦截所有对Web服务器管理的任意Web资源的请求,从而实现特殊的控制功能。例如实现url权限的控制,过滤敏感信息以及压缩响应格式等一些高级的功能。
2.Servlet过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
3.可以将一个或多个Servlet 过滤器附加到一个Servlet或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages(JSP)文件和HTML页面。调用Servlet前调用所有附加的 Servlet过滤器。
4.Servlet过滤器是可用于Servlet 编程的Java类,可以实现以下目的:
在客户端的请求访问后端资源之前,拦截这些请求。
在服务器的响应发送回客户端之前,处理这些响应。
5.当Web容器启动Web应用程序时,为在部署描述符中声明的每一个过滤器创建一个实例。Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。过滤器通过Web部署描述符(web.xml中的XML标签来声明,然后映射到您的应用程序的部署描述符中的Servlet名称或URL模式。
6.FilterChain:在一个Web工程中,对同一个Web资源访问时,可以有多个Filter过滤器对其进行拦截,多个过滤器在tomcat服务器启动时,组成过滤器链FilterChain。
每一个Filter必须执行chain.doFilter(request,response)方法,才能将控制权交到下一个过滤器或者目标资源。
1 | package com.noob.filter; |
1 | package com.noob.servlet; |
1 | <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" |
1 | <dependency> |
Listener
Listener(监听器),用于监听Web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中对应的方法。
1 | package com.noob.listener; |
1 | <listener> |
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | <!--Tomcat10编写jsp getServletConfig()会报错但不影响使用 也可更换Tomcat9--> |
GUI
1 | package com.noob.listener; |
1 | package com.noob.filter; |
1 | package com.noob.servlet; |
1 | package com.noob.servlet; |
webapp/sys/error.jsp - webapp/error.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
webapp/success/error.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
webapp/login.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" |
JDBC
1.Java数据库连接(Java Database Connectivity,JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC是面向关系型数据库的。
2.JDBC驱动程序共分四种类型:
- JDBC-ODBC桥
- 本地API驱动
- 网络协议驱动
- 本地协议驱动
数据库依赖(Mysql驱动)
1 | <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> |
1 | package com.noob.test; |
1.警告:Loading class `com.mysql.jdbc.Driver’. This is deprecated.
com.mysql.jdbc.Driver已被弃用,使用新的驱动com.mysql.cj.jdbc.Driver.
2.PreparedStatement接口继承Statement(始终以PreparedStatement代替Statement,防止sql注入,且执行速度更高):
PreparedStatement实例包含已编译的SQL语句。包含于PreparedStatement对象中的SQL语句可具有一个或多个IN参数。IN参数的值在SQL语句创建时未被指定。相反的,该语句为每个IN参数保留一个问号(
?
)作为占位符,每个问号的值必须在该语句执行之前,通过对应的set方法来提供。由于PreparedStatement对象已预编译过,所以其执行速度要快于Statement对象。因此,多次执行的 SQL语句经常创建PreparedStatement对象,以提高效率。
作为Statement的子类,PreparedStatement继承了Statement的所有功能。另外它还添加了一整套方法,用于设置发送给数据库以取代I 参数占位符的值。同时,三种方法execute、 executeQuery和 executeUpdate已被更改以使之不再需要参数。这些方法的Statement形式(接受SQL语句参数的形式)不应该用于PreparedStatement对象。
1 | package com.noob.test; |
1 | CREATE TABLE users ( |
事务
1.事务控制何时更改提交并应用于数据库。将单个SQL语句或一组SQL语句视为一个逻辑单元,如果任何语句失败,整个事务将失败。
2.数据库系统保证在一个事务中的所有SQL要么全部执行成功,要么全部不执行,即数据库事务具有ACID特性:
- Atomicity:原子性
- Consistency:一致性
- Isolation:隔离性
- Durability:持久性
1 | CREATE TABLE account ( |
1 | start transaction ; |
1 | package com.noob.test; |
Junit
JUnit是一个[ava语言的单元测试框架。它由Kent Beck和Erich Gamma建立。JUnit有它自己的JUnit扩展生态圈。
1 | <!-- https://mvnrepository.com/artifact/junit/junit --> |
1 | package com.noob.test; |
无法导入junit包:删除pom.xml中junit依赖中的<scope>test</scope>。
订单超市管理系统SMBMS
来源:KuangStudy SMBMS
前端提交表单->Servlet->Service->Dao
1.创建对应数据库
1 | CREATE DATABASE `smbms`; |
2.新建Maven Webapp项目
- 配置Tomcat
- Edit Configuration
- web.xml
- 导入依赖
- pom.xml
- 连接数据库
- DataBase ->smbms
1 | <!--pom.xml--> |
1 | <!--web.xml--> |
3.创建包结构(项目开发规范)
1 | com |
4.编写实体类(ORM映射:表-类映射)
- User类
1 | package com.noob.pojo; |
- Bill类
1 | import java.math.BigDecimal; |
- Role类
1 | import java.util.Date; |
- Provider类
1 | import java.util.Date; |
5.编写基础公共类
- 数据库配置文件(main->resource->db.properties)
1 | driver=com.mysql.cj.jdbc.Driver |
- 数据库公共类(Dao->BaseDao.java)
1 | package com.noob.dao; |
- 编写字符过滤器并注册
1 | package com.noob.filter; |
6.编写或导入静态资源
1 | webapp |
登录
1.编写前端页面(webapp->login.jsp)
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
2.设置首页
1 | <!--设置欢迎界面--> |
3.编写Dao层用户登录的接口
1 | package com.noob.dao.user; |
4.编写Dao接口实现类
1 | package com.noob.dao.user; |
5.编写业务层接口
1 | package com.noob.service.user; |
6.编写业务层实现
1 | package com.noob.service.user; |
6.编写或导入相关页面:webapp-jsp
1 | <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> |
7.编写工具类
1 | package com.noob.util; |
8.编写Servlet
1 | package com.noob.servlet; |
9.注册Servlet
1 | <!--Servlet--> |
10.密码验证
1 | /* |
注销
移除Session,返回登录界面
1.编写Servlet
1 | package com.noob.servlet; |
2.注册servlet
1 | <servlet> |
3.编写登录拦截Filter
1 | package com.noob.filter; |
4.注册Filter
1 | <!--用户登录过滤器--> |
修改密码
1.编写或导入前端代码(pwdmodify.jsp)
1 | <%@ page language="java" contentType="text/html; charset=UTF-8" |
2.编写UserDao接口
1 | /*修改当前用户密码*/ |
3.编写UserDao接口实现类(UserDaoImpl.java)
1 | public int updatePwd(Connection connection, int id, String password) throws SQLException { |
4.编写UserService接口
1 | /*根据用户ID修改密码*/ |
5.编写UserService实现类
1 | public boolean updatePwd(int id, String pwd) { |
6.编写Servlet
1 | package com.noob.servlet; |
7.注册Servlet
1 | <servlet> |
用户管理
1.编写或导入分页的工具类
1 | package com.noob.util; |
- userlist.jsp
- rollpage.jsp
获取用户数量
1.编写UserDao接口
1 | /*根据用户名或角查询用户总数*/ |
2.编写UserDao接口实现类
1 | public int getUserCount(Connection connection, String username, int userRole) throws SQLException { |
3.编写UserService接口
1 | /*查询记录数*/ |
4.编写UserService实现类
1 | public int getUserCount(String username, int userRole) { |
获取用户列表
1.编写UserDao接口
1 | /*通过条件查询-userList*/ |
2.编写UserDao接口实现类
1 | public List<User> getUserList(Connection connection, String userName, int userRole, int currentPageNo, int pageSize) throws Exception { |
3.编写UserService接口
1 | /*根据条件查询用户列表*/ |
4.编写UserService接口
1 | public List<User> getUserList(String queryUserName, int queryUserRole, int currentPageNo, int pageSize) { |
获取角色列表
1.编写接口RoleDao
1 | package com.noob.dao.role; |
2.编写接口RoleDao实现类
1 | package com.noob.dao.role; |
3.编写RoleService接口
1 | package com.noob.service.role; |
4.编写RoleService接口实现类
1 | package com.noob.service.role; |
5.编写Servlet
1 | package com.noob.servlet; |
前端乱码:js文件编码改为UTF-8-Bom即可。
文件上传
1.浏览器在上传的过程中将文件以流的形式提交到服务器端。
2.环境依赖:
3.在项目下新建lib文件夹(将jar加入)->Add as Libaray(不使用maven管理依赖),也可在Project Structure下Libraries下添加
4.文件上传:
- 上传文件需要放在外界无法访问的目录下,如WEB-INF目录
- 需要为上传文件建立一个唯一的文件名(防止文件覆盖)
- 限制上传文件的最大值
- 限制上传文件的类型并判断后缀名是否合法
5.ServletFileUpload负责处理上传的文件数据,并将表单中输入封装为FileItem对象。
- 在使用ServletFileUpload对象解析请求时需要DiskFileItemFactory对象。
- 需要在进行解析前构造好DiskFileItemFactory对象,通过ServletFileUpload对象的构造方法或setFileItemFactory方法设置ServletFileUpload对象的fileItemFactory属性。
1.ServletFileUpload类
ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装在一个FileItem对象中. 使用其parseRequest(HttpServletRequest)方法可以将通过表单中每一个HTML标签提交的数据封装成一个FileItem对象,然后以List列表的形式返回。
- FileServlet.java
1 | package com.noob.servlet; |
- index.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- info.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
1 | ├─out |
1 | <servlet> |
邮件发送
1.发送邮件:SMTP协议
接受邮件:POP3协议
2.环境依赖 Tomcat9:
3.核心类:
- Session对象:定义整个程序所需环境信息,比如主机名、端口号、采用的邮件发送和接受协议
- Transport对象:用于发送邮件
- Message对象:电子邮件
- Store对象:用来接受文件
4.MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。
QQ邮箱
网页端登录QQ邮箱,设置->账号->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务->开启POP3/SMTP服务->得到授权码
发送普通邮件
1 | import com.sun.mail.util.MailSSLSocketFactory; |
1.javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
- 法一:
进入Java安装目录->jre\lib\security\java.security将其中
1 jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \删除SSLv3, TLSv1, TLSv1.1
1 jdk.tls.disabledAlgorithms=RC4, DES, MD5withRSA, \重启项目即可
- 法二:添加代码,明确指出协议即可
1
2 prop.setProperty("mail.smtp.starttls.required", "true");
prop.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");
发送图片
MimeBadyPart类:MIME消息,与MimeMessage类一样都是从Part接口继承过来。
MimeMultipart类:抽象类Multipart的实现子类,用来组合多个MIME消息,一个MimeMultipart对象可以包含多个代表MIME消息的MimeBadyPart对象。
1 | package com.noob; |
发送附件
1 | package com.noob; |
注册通知邮件
1.前端数据封装成实体类
1 | package com.noob.pojo; |
2.编写Servlet类
1 | import com.noob.pojo.User; |
3.编写发送邮件类
1 | import com.noob.pojo.User; |
4.编写前端文件
- index.jsp
1 | <%"text/html;charset=utf-8" language="java" %> contentType= |
- info.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
5.配置
1 | <!--pom.xml--> |