JavaEE下三大核心技术
Servlet:运行在JavaEE服务器中的Java程序
JSP本质上就是一个Servlet,只不过开发时看到的样子不同
Filter:过滤器,Servlet的一种补充,采用面向切面编程的思想,可以同时对多个页面进行相同的处理
- 监视一些动作或行为
- 对象的声明周期
- 创建
- 销毁
- 属性操作
- setAttribute
- removeAttribute
- 对象的声明周期
- 监视三种对象
- request对象
- session对象
- application对象
Listener:监听器,可以监听三大域对象request,session,application的生命周期以及属性变量
服务器容器:Tomcat,通过动态网页技术处理用户的请求

bin:执行文件
conf:配置
lib:库
logs:日志文件
temp:tomcat运行中的临时文件
webapps:网站
work:tomcat在运行过程中,生成的中间文件,存放JSP的中间文件
配置tomcat
新建一个JavaEE项目
Servlet编写一个动态网页
Servlet生命周期的三个方法
init
- 只会执行一次
- 当Servlet第一次被使用时,Tomcat容器就会创建这个Servlet对象,并且执行初始化方法
- 以后再使用时,不需要创建了,直接使用第一次创建的对象即可(单例模式)
service
- 当客户端发送一次请求,就会执行一次
destroy
- 只会执行一次
- 当服务器正常关闭/主动卸载Servlet时,才会被销毁
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>Demo0830</display-name>
<!-- 当访问xxx/路径时,默认使用以下几个文件 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置Servlet -->
<servlet>
<servlet-name>testServlet</servlet-name>
<!-- 类的全限定名:包名+类名 -->
<servlet-class>com.situ.servlet.TestServlet</servlet-class>
</servlet>
<!-- 地址映射 -->
<servlet-mapping>
<!-- 名字 -->
<servlet-name>testServlet</servlet-name>
<!-- 访问规则 -->
<url-pattern>/test</url-pattern>
<url-pattern>/t</url-pattern>
</servlet-mapping>
</web-app>
package com.situ.servlet;
import javax.servlet.*;
import java.io.IOException;
import java.util.Date;
/**
* 变成一个Servlet->实现Servlet接口
* 这个类创建好,只是可以作为一个Servlet使用
*
* 配置:告诉Tomcat,把这个类当成一个Servlet
* 1.在web.xml中配置
* 2.注解
*/
public class TestServlet implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//初始化Servlet
System.out.println("初始化Servlet");
}
@Override
public ServletConfig getServletConfig() {
//获取Servlet中的配置信息,通常都在web.xml文件中
return null;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
//Servlet核心
//用来响应客户端请求
response.getWriter().write("Hello Servlet!!!");
response.getWriter().write(new Date().toString());
}
@Override
public String getServletInfo() {
//获取Servlet信息
return null;
}
@Override
public void destroy() {
//销毁Servlet中占用的资源
System.out.println("销毁Servlet");
}
}
HTTP的请求
Get和Post请求
Get请求
Get请求(默认请求方式)
包含:
- 在浏览器地址栏中输入地址,发送请求
- 超链接
- From表单默认请求方式
- Ajax技术下的默认请求方式
Post请求
Post请求(需要设置)
- 当Form表单的method属性设置为post时
- Ajax技术下,如果设置请求方式为post
Get和Post请求区别
- 传递参数的方式不同
- Get会将参数以?的形式拼接在URL的后面,多个参数使用&分隔
url?参数1=值1&&参数2=值2 - Post会将参数通过负载形式向服务器发送数据
- Get会将参数以?的形式拼接在URL的后面,多个参数使用&分隔
- 参数类型不同
- Get只能发送字符串类型的数据
- Post不仅可以发送字符串类型的,还可以发送二进制的(eg:文件)
- 参数的长度不同
- Get请求的参数,受限于URL长度的限制,不同浏览器要求不一样
- Post请求可以分段传送数据,可以提交很大的参数,只要服务器允许
- 安全性不同
- Get请求方式会暴露明文,安全性低
- Post数据会隐藏,安全性略高
package com.situ.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* HttpServlet的子类
*
*/
@WebServlet("/Test2Servlet") //web3.0开始,Servlet可以使用注解进行配置
//修改了了web.xml或者是注释上的配置信息,必须重新启动加载
public class Test2Servlet extends HttpServlet {
//序列化时版本号
private static final long serialVersionUID = 1L;
public Test2Servlet(){
super();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
//处理get类型的请求
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
//处理Post类型的请求
//默认情况下,doPost会调用doGet,不管get还是post请求,都由doGet方法来处理
doGet(request,response);
}
}
用户登录实现
<%--
Created by IntelliJ IDEA.
User: 20506
Date: 2024/3/10
Time: 20:29
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<h1>用户登录</h1>
<form action="login" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
${error} <!-- EL表达式,显示request对象中的error属性值 -->
</form>
</body>
</html>
<%--
Created by IntelliJ IDEA.
User: 20506
Date: 2024/3/10
Time: 20:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录成功</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>
package com.situ.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取参数:账号和密码
String username = req.getParameter("username");
String password = req.getParameter("password");
// 2.处理业务:验证账号和密码是否正确
if("tom".equals(username) && "123".equals(password)){
//登录成功
//3.返回数据:跳转页面
// 重定向
resp.sendRedirect("success.jsp");
} else {
//登录失败
//3.返回数据:跳转页面
//账号或密码不正确
req.setAttribute("error","账号或密码错误");
//返回登录页面
//请求转发
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
访问服务器的基本过程

重定向的实现过程

请求转发的实现方式

请求转发和重定向的区别
- 请求转发是服务器内部的行为,重定向是服务器指挥客户端请求新的页面
- 请求转发只有一次请求,多个页面会共享同一对requesthe response对象,重定向会发送两次请求,两次请求都会生成新的request和response对象
- 请求转发可以使用request对象实现几个页面中数据的共享,重定向不能使用request共享数据
- 请求转发地址栏不会变化,重定向会修改地址栏到跳转页面
什么时候使用请求转发和重定向
跳转页面之间需要进行数据共享时,使用请求转发,否则使用重定向
JSP
Java Server Page
- 静态代码:html,css,js
- 指令标签:page,include,taglib
- 动作标签:out,forward(请求转发),include,param…
- 内嵌Java代码
- EL表达式
- JSTL
九大内置对象,四大作用域
指令标签
<%@ 标签名 属性 %>
Page

<%@ page %>设置当前页面的相关属性
- Language:语言
- contentType:当前页面的内容类型
- 相当于response.setContentType();
- pageEncoding:当前页面的保存时的编码格式
- import:引入外部的类
- isErrorPage:设置成true,是一种错误处理页面,可以使用exception对象,可以看到错误信息,默认值是false
- errorPage:指定当前页面抛出异常时的处理页面
<font style="color:#080808;background-color:#ffffff;"><%=exception%></font>
include
静态地引入一个外部的页面,相当于将外部页面的代码复制到当前页面中再翻译,编译,执行
<%@ include file="外部页面" %>
taglib
引入自定义标签库
<%@taglib prefix="前缀" uri="xxx" %>
比如在xxx里定义一个自定义的标签t
<前缀:t></前缀:t>
使用JSTL时
动作标签
<jsp:标签名 ></jsp:标签名>
forward
请求转发
<jsp:forward page="页面"></jsp:forward>

作用相当于request.getRequestDispatcher("success.jsp").forward(request,response);
include
动态地引入一个外部页面,两个页面会分别翻译,编译,执行
只是将外部页面执行结果添加到当前页面的执行结果中
动态引入是在执行时引入的
<jsp:include page="页面"></jsp:include>
静态引入和动态引入的区别
- 静态引入是先引入再翻译,编译JSP文件,动态引入是执行时,将外部页面的执行结果加入到当前页面
- 静态引入只会生成一个文件,动态引入分别生成单独的文件
- 静态引入执行效率高,动态页面灵活性更高
param
为forward和include添加参数
<jsp:include page="需要添加的页面">
<jsp:param name="xxx" value="xxx"/>
</jsp:include>
内嵌Java代码
Java片段
<% 像在Java的方法中编写代码 %>
不能定义方法,变量也都是局部变量
输出表达式
<%= Java表达式 %>
计算表达式的值,并且输出到当前页面中
声明片段
<%! 定义全局的变量,方法 %>
可以像定义类的属性和方法一样编写代码
定义的全局变量实际上是当前JSP类的成员变量
JSP执行过程

九大内置对象和四大作用域
九大内置对象
在JSP页面中可以直接使用的对象:
request
请求对象,封装携带来自客户端的数据
HttpServletRequest类型的
request.getParameter("参数名");
request.getSession();
request.getServletContext();
request.getRequestDispatcher("xxx").forward(request,response)
request.setAttribute("属性名","属性值");
request.getAttribute("属性名");
request.removeAttribute("属性名");
response
响应对象
HttpServletResponse类型
response.getWriter();
response.setContentType();
response.sendRedirect("xxx");
session
会话对象
在一段时间内,客户端浏览器与服务器之间的连续多次请求
会话可以实现多次请求之间的数据共享
session.setAttribute("属性名","属性值");
session.getAttribute("属性名");
session.removeAttrebute("属性名");
Session作用的范围有多大:
一个会话中可以包含多次请求
终止会话的情况:1.同一台电脑,不同的浏览器,请求不在同一会话中;2.同一个浏览器打开再关闭,会创建新的会话;3.同一个浏览器,不关闭,如果长时间不访问,服务器会关闭这个会话(Tomcat默认的Session超时时间是30分钟,可以修改);4.在Session对象上调用invalidate(),当前的Session对象会主动销毁
<session-config>
<session-timeout>1</session-timeout>
<!-- 设置必须为整数,如果设置为0及以下,session永不超时 -->
</session-config>
服务器如何知道两个请求属于同一个Session?
通过Cookie
Session 是基于 Cookie 实现的
session对象的生命周期
- 创建:客户端发送请求访问服务器,主动申请session时会创建session对象
- 销毁:
- 主动销毁:安全退出,执行代码让session失效
session.invalidate();
2. 超时:最后一次有效访问服务器后30分钟内仔没有和服务器有任何的交互,服务器会将超时的session销毁
3.
application
应用程序对象,对应在Tomcat运行的一个项目
数据类型:ServletContext类型(Servlet上下文)->Servlet的容器
可以实现不同会话之间的数据共享
application.setAttribute("属性名",属性值);
application.getAttribute("属性名");
application.removeAttribute("属性名");
page
代表当前JSP页面(xxx_jsp类的对象)
pageContext
当前页面上下文
可以获取其他8个内置对象
config
当前页面的配置信息,基本上没有用
out
输出流/输出对象,写道response中,向客户端返回
可以向JSP中输出内容
exception
异常对象,这个对象只存在于错误处理页面(isErrorPage=“true”)
异常对象是由上一个页面抛出的
四大作用域
page
作用域范围为当前JSP页面
page,pageContext,config,out,exception
request
作用域范围为本次请求
request,response
session
作用域范围为本次会话
session
application
作用域范围为本次应用运行
application
token:不会保存在服务器内存中,分布式服务器登录
- 应当尽量使用作用域范围更小的对象
- Session中尽量少放东西
EL和JSTL
EL表达式
默认会按照request,session,application访问属性
EL表达式是JSP中的表达式语言
作用:简化JSP页面中的输出操作
JSP中的输出操作:
- out.write();
- out.append();
- out.print();
- <%= Java表达式 %>
<%@ page import="com.situ.entity.User" %><%--
Created by IntelliJ IDEA.
User: 20506
Date: 2024/3/16
Time: 11:39
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.situ.entity.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
String a = "输出信息";
%>
<%
out.write(a);
%>
<%= a %> <br>
<%
request.setAttribute("info","request中的数据");
session.setAttribute("info","session中的数据");
application.setAttribute("info","application中的数据");
//实体类类型
User user = new User();
user.setUsername("tom");
user.setPassword("123");
request.setAttribute("user",user);
String[] arr = {"Java","HTML","MySQL"};
request.setAttribute("arr",arr);
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
<%= request.getAttribute("info") %> <br>
<%= session.getAttribute("info")%> <br>
<%= application.getAttribute("info")%> <br>
<%
out.write(request.getAttribute("info").toString());
out.write(session.getAttribute("info").toString());
out.write(application.getAttribute("info").toString());
%>
<br>
EL表达式操作
<br>
${info} <br>
${requestScope.info} <br>
${sessionScope.info} <br>
${applicationScope.info}<br>
${param.info} <br> <!--访问参数中的info -->
<!--访问实体类对象 -->
${user.toString()} <br>
${user.username} 调用user.getUsername()<br>
${user.password} 调用user.getPassword()<br>
${arr} <br>
${list} <br>
<!-- 根据条件显示不同的内容 -->
<%
int score=80;
if (score>60){
out.print("及格");
}
%>
</body>
</html>
JSTL
Java标准标签库
可以像JSP动作标签一样使用
JSTL包含:
- core:14个标签,if,foreach…
- fmt:格式化操作
- function:提供了常用的处理方法
- xml:XML文件解析
- sql:SQL操作数据库

使用taglib引入JSTL的库
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
core
<!-- 引入JSTL -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="true"> <!-- 还可以使用el表达式例如${requestScope.info != null} -->
条件成立
</c:if>
<c:if test="false">
条件不成立
</c:if>
<c:choose>
<c:when test="${10<5}">
条件不成立
</c:when>
<c:when test="${10<5}">
条件不成立
</c:when>
<c:otherwise>
条件都不成立
</c:otherwise>
</c:choose>
<!-- 遍历集合 -->
<c:forEach items="${list}" var="l">
${l}
</c:forEach>
请求保持技术
Session
会话对象
在一段时间内,客户端浏览器与服务器之间的多次请求
将用户信息保存在服务器中,可以保存很多不同类型的数据,
会话可以实现多次请求之间的数据共享
session.setAttribute("属性名","属性值");
session.getAttribute("属性名");
session.removeAttrebute("属性名");
Session作用的范围有多大:
一个会话中可以包含多次请求
终止会话的情况:1.同一台电脑,不同的浏览器,请求不在同一会话中;2.同一个浏览器打开再关闭,会创建新的会话;3.同一个浏览器,不关闭,如果长时间不访问,服务器会关闭这个会话(Tomcat默认的Session超时时间是30分钟,可以修改);4.在Session对象上调用invalidate(),当前的Session对象会主动销毁
<session-config>
<session-timeout>1</session-timeout>
</session-config>
服务器如何知道两个请求属于同一个Session?
通过Cookie
Session 是基于 Cookie 实现的,使用cookie保存SessionID
Cookie
浏览器数据保存的功能,不会给服务器增加负担,安全性低
只能保存字符串,也不能太多
token
数据保存在浏览器中,保存方式可以使用cookie,也可以使用sessionStorage,还可以使用localStorage
对用户信息进行加密的字符串
可以用在分布式环境下
JSP+Servlet
项目架构
Model 1
所有的东西都写在JSP中
JSP只负责显示页面
所有与逻辑相关的东西都放在Servlet中
登录功能:JSP负责提供表单,点击登录时请求发送给Servlet,调用数据库查询,跳转页面
当业务越来越复杂时,Servlet中代码就会越来越复杂
Model 2
JSP+Servlet+Model层
Servlet只负责接收请求,调用Model层,返回页面
Web三层架构
由MVC三层架构演化而来
M:Model 模型
逻辑模型:用来保存数据的类,实体类
逻辑模型:处理逻辑的,Dao层,业务模型
V:View 视图
提供人机交互的界面,通常是JSP
C:Controller 控制层
协调管理V与M之间的相互联系,通常由Servlet完成
Web的三层架构是指Servlet,Service,Dao层


创建项目
- 创建项目
- 导入需要的第三方jar包

<%
String basePath = request.getScheme() +"://"
+request.getServerName() +":"
+request.getServerPort()
+request.getContextPath() +"/";
%>
实体类创建规则:
1.实体类的类名与数据表的表名一致
2.实体类的属性与数据表字段一致
属性名与字段名一致
属性数据类型与字段数据类型一致(使用包装类,java.util.Date)
3.属性私有化,提供公共的Get和Set方法
4.实体类应该有一个无参的构造方法

1万+

被折叠的 条评论
为什么被折叠?



