JavaWeb
JavaWeb环境搭建
打开IDEA
New Project-Java Enterprise
选择Servlet
选择 Edit Configurations
加载tomcat服务器
接着选择Modules-dependencies
添加tomcat服务器至项目中
Javaee环境搭建完成
javaEE 环境搭建参考文章:
https://blog.csdn.net/weixin_45802966/article/details/120150839
https://blog.csdn.net/ok3356/article/details/82151826
JavaWeb四大作用域
Web开发中的四个域对象(范围由小到大):
page(jsp有效) 、request(一次请求) 、session(一次会话) 、application(当前web应用)
page域指的是pageContext.
request域指的是HttpServletRequest
session 域指的是HTTPSession
application 域指的是ServletContext
之所以他们是域对象,原因就是他们都内置了map集合,都有setAttribute getAttribute方法。而且他们的name都是String类型,而value都是Object类型。
他们都有自己固定的生命周期和作用域。
生命周期
page:jsp页面被执行,生命周期开始,jsp页面执行完毕,声明周期结束。
request:用户发送一个请求,开始,服务器返回响应,请求结束,生命周期结束。
session:用户打开浏览器访问,创建session(开始),session超时或被声明失效,该对象生命周期结束。
application:web应用加载的时候创建。Web应用被移除或服务器关闭,对象销毁。[结束]。
总结:
1.需要定义Map时不如用page,
2.请求Servlet,转发给jsp的数据存request,
3.请求重定向带过去的数据存Session,
4.全局的数据存application。
4.ServletContext:WEB容器在启动时,他会为每一个【WEB应用程序】都创建一个对应的ServletContext对象,它代表【当前WEB应用】,驻留在服务器的内存里。
在一个contex中的数据都是共享的,它是web应用的配置信息和配置参数。
参考:
https://blog.csdn.net/m0_56776375/article/details/121139525
Servlet
Servlet概念
- 概念:运行在服务器端的小程序
- Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
- 将来我们自定义一个类,实现Servlet接口,复写方法。
- Servlet是在Java Web容器上运行的小程序,通常我们用Servlet来处理一些较为复杂的服务器端的业务逻辑。值得注意的是在Servlet3.0之后(Tomcat7+)可以使用注解方式配置Servlet了。@WebSerice
Servlet快速入门
-
创建JavaEE项目
-
定义一个类,实现Servlet接口
public class ServletDemo1 implements Servlet
-
实现接口中的抽象方法
-
配置Servlet
在web.xml中配置:<!--配置Servlet --> <servlet> <servlet-name>demo1</servlet-name> <servlet-class>cn.tyut.web.servlet.ServletDemo1</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping>
Servlet执行原理
-
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
-
查找web.xml文件,是否有对应的
<url-pattern>
标签体内容。 -
如果有,则在找到对应的
<servlet-class>
全类名 -
tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
Servlet的接口方法
init()接口
void init(ServletConfig config)
Servlet容器调用,用于初始化Servlet,用ServletConfig对象参数来启动配置,只执行一次。
service()接口
void service(ServletRequest request, ServletResponse response)
Servlet容器调用,处理request对象中描述的请求,使用response对象返回请求结果。
doGet()/doPost()等接口
由service方法调用,用于处理GET/POST请求。
destroy()接口
void destroy()
Servlet容器调用,卸载Servlet所占的资源。
getServletConfig()接口
ServletConfig getServletConfig();
返回一个ServletConfig对象,该对象包含当前Servlet的初始化信息。
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.tyut.web.servlet.ServletDemo1</servlet-class>
<init-param>
<param-name>userName</param-name>
<param-value>small_fish</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
Servlet中的生命周期方法
-
被创建:执行init方法,只执行一次
-
Servlet什么时候被创建?
-
默认情况下,第一次被访问时,Servlet被创建
-
可以配置执行Servlet的创建时机。
- 在
标签下配置 - 第一次被访问时,创建
<load-on-startup>
的值为负数 - 在服务器启动时,创建
<load-on-startup>
的值为0或正整数
- 第一次被访问时,创建
- 在
-
-
Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
-
-
提供服务:执行service方法,执行多次
- 每次访问Servlet时,Service方法都会被调用一次。
-
被销毁:执行destroy方法,只执行一次
-
Servlet被销毁时执行。服务器关闭时,Servlet被销毁
-
只有服务器正常关闭时,才会执行destroy方法。
-
destroy方法在Servlet被销毁之前执行,一般用于释放资源
-
Response对象
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
response.sendRedirect("/day15/responseDemo2");
* 重定向的特点:redirect
1. 地址栏发生变化
2. 重定向可以访问其他站点(服务器)的资源
3. 重定向是两次请求。不能使用request对象来共享数据
* 转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据
ServletContext对象
-
功能:
-
获取MIME类型:
-
MIME类型:在互联网通信过程中定义的一种文件数据类型
- 格式: 大类型/小类型 text/html image/jpeg
-
获取:String getMimeType(String file)
-
-
域对象:共享数据
- setAttribute(String name,Object value)
- getAttribute(String name)
- removeAttribute(String name)
- ServletContext对象范围:所有用户所有请求的数据
-
获取文件的真实(服务器)路径
-
方法:String getRealPath(String path)
String b = context.getRealPath("/b.txt");//web目录下资源访问
System.out.println(b);String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
System.out.println(c);String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
System.out.println(a);
-
-
Filter
filter概念
过滤器是web中的一个组件,可以用于过滤请求。在服务器目标资源之前优先拦截到请求,对其进行处理,可以放行该请求也可以直接拦截掉。如果请求被放行,那么该请求的响应也会被过滤器拦截。
Filter编写流程
- 编写一个类实现Filter接口
- 实现接口中的方法,重点是在doFilter方法中,可以调用chain.doFilter实现请求的放行
- 通过配置告知tomcat服务器Filter的信息
Web.xml配置
<filter>
<filter-name>demo1</filter-name>
<filter-class>com.tyut.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注解配置
@WebFilter("/*")
Filter执行流程
调用chain.doFilter()时,内部实际进行了判断,判断当前过滤器链中是否有下一个过滤器节点。如果有,则调用其doFilter方法。如果没有,则放行到目标资源位置。在一个过滤器链中,只有所有的过滤器都执行了chain.doFilter,那么这次请求才能访问到目标资源。只要有一个过滤器拦截住没有放行,那么整条过滤器链相当于就没有放行。
el表达式
一、EL表达式介绍
- Expression Language表达式语言
- 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
- 在JSP2.0开始引入概念
语法格式
- 在JSP页面的任何静态部分均可通过:${expression}来获取到指定表达式的值
二、EL获取数据(从四大域中获取属性)
- EL只能从四大域中获取属性
1、如果没有使用EL的内置对象,则查找数据顺序是依次按照由小到大范围从四大域中查找指定名称的属性值
- pageContext<request<session<application
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${name } //输出linjie
</body>
</html>
可以看出没有使用EL内置对象时查找顺序是由小到大,所以最先显示的是pageContext域中的
2、使用EL内置对象,从指定域中获取数据,提高了查找效率
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name } // bilibili
</body>
</html>
可以看出,使用applicationScope即可指定application域中的name输出,当然其他域也是类似,下文会说这四大域属性相关的内置对象
三、EL中的内置对象
- EL有11个内置对象,这里主要讲域属性相关的4个和其他4个
- EL的11个内置对象,除了pageContext以外,其他10个内置对象的类型都是java.util.Map类型
1、域属性相关(4个)
pageScope:从page范围域属性空间中查找指定的key
requestScope:从request范围域属性空间中查找指定的key
sessionScope:从session范围域属性空间中查找指定的key
applicationScope:从application范围域属性空间中查找指定的key
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
pageContext.setAttribute("name", "linjie");
request.setAttribute("name", "lucy");
session.setAttribute("name", "king");
application.setAttribute("name", "bilibili");
%>
name=${applicationScope.name }<br>
name=${pageScope.name }<br>
name=${sessionScope.name }<br>
name=${requestScope.name }<br>
</body>
</html>
2、其他重要内置对象(4个)
1、pageContext
该pageContext与JSP内置对象pageContext是同一个对象。通过该对象,可以获取到request、response、session、servletContext、servletConfig等对象
注意:这些对象在EL里不是内置对象,这些对象只能通过pageContext获取
- 在EL中直接${pageContext.request}即可获取request对象,其底层调用的是pageContext.getRequest()方法。同理,也可以通过类似方法获取其他对象
- 重点:其中最常用的:${pageContext.request.contextPath },代表web应用下的根,可以看出下面action中的路径可读性更强了
参考链接: