请求行用来说明请求类型和要访问的资源以及所使用的HTTP版本,格式如下:
请求类型 请求的路径 协议的版本(1.1)
请求头是紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息,格式(key:value)如下:
主机 请求长度 请求的浏览器相关信息
空白行就是请求头部的空行,即使后面的请求数据为空则必须有空行。
请求体也叫请求数据,可以添加任意的其他数据。
POST /task01_demo01/demo1.html HTTP/1.1
Host: localhost:8088
Content-Length: 21
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
name=scott&pwd=123456
响应行用来说明HTTP协议版本号和状态码以及状态消息,格式如下:
协议的版本(1.0 1.1) 状态码 (200 成功 404 路径错误 500 服务错误) 状态信息
响应头用来说明客户端要使用的一些附加信息,格式(key:value)。
空白行就是响应头部的空行,即使后面的请求数据为空则必须有空行。
响应体用来服务器返回给客户端的文本信息。
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 588
Date: Thu, 08 Sep 2021 12:59:54 GMT
示例1
这是一个HTML页面
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<role rolename="manager-gui"/>
<user username="stone" password="stone" roles="manager-gui"/>
<servlet>
<servlet-name> HelloServlet servlet-name>
<servlet-class> com.lagou.task01.HelloServlet servlet-class>
servlet>
<servlet-mapping>
<servlet-name> HelloServlet servlet-name>
<url-pattern> /hello url-pattern>
servlet-mapping>
http://localhost:8080/工程路径/url-pattern的内容
(1)基本概念
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
void init(ServletConfig config) | 由servlet容器调用,以向servlet指示servlet正在被放入服务中 |
void service(ServletRequest req, ServletResponse res) | 由servlet容器调用,以允许servlet响应请求 |
ServletConfig getServletConfig() | 返回ServletConfig对象,该对象包含此servlet的初始化和启动参数 |
String getServletInfo() | 返回有关servlet的信息,如作者、版本和版权 |
void destroy() | 由servlet容器调用,以向servlet指示该servlet正在退出服务 |
(1)基本概念
javax.servlet.GenericServlet类主要用于定义一个通用的、与协议无关的servlet,该类实现了 Servlet接口。
若编写通用servlet,只需重写service抽象方法即可。
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
abstract void service(ServletRequest req, ServletResponse res) | 由servlet容器调用允许servlet响应请求 |
(1)基本概念
javax.servlet.http.HttpServlet类是个抽象类并继承了GenericServlet类。
用于创建适用于网站的HTTP Servlet,该类的子类必须至少重写一个方法。
以后开发中推荐使用此方法创建Servlet
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
void doGet(HttpServletRequest req, HttpServletResponse resp) | 处理客户端的GET请求 |
void doPost(HttpServletRequest req, HttpServletResponse resp) | 处理客户端的POST请求 |
void init() | 进行初始化操作 |
void service(HttpServletRequest req, HttpServletResponse resp) | 根据请求决定调用doGet还是doPost方法 |
void destroy() | 删除实例时释放资源 |
发出GET请求的主要方式:
(1)在浏览器输入URL按回车
(2)点击超链接
(3)点击submit按钮,提交
发出POST请求的方法如下:
点击submit按钮,提交
(1)基本概念
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
String getParameter(String name) | 以字符串形式返回请求参数的值,如果该参数不存在,则返回空值 |
String[] getParameterValues( String name) | 返回一个字符串对象数组,其中包含给定请求参数所具有的所有值,如果该参数不存在,则返回空值 |
Enumeration getParameterNames() | 返回包含此请求中包含的参数名称的字符串对象的枚举。如果请求没有参数,则方法返回空枚举 |
Map |
返回请求参数的键值对,一个键可以对应多个值 |
String getRemoteAddr() | 返回发送请求的客户端或最后一个代理的IP地址 |
int getRemotePort() | 返回发送请求的客户端或最后一个代理的端口号 |
(1)基本概念
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
String getRequestURI() | 返回此请求的资源路径信息 |
StringBuffer getRequestURL() | 返回此请求的完整路径信息 |
String getMethod() | 返回发出此请求的HTTP方法的名称,例如GET、POST |
String getQueryString() | 返回路径后面请求中附带的参数 |
String getServletPath() | 返回此请求中调用servlet的路径部分 |
(1)基本概念
(2)常用方法
方法声明 | 功能介绍 |
---|---|
PrintWriter getWriter() | 返回可向客户端发送字符文本的PrintWriter对象 |
String getCharacterEncoding() | 获取响应内容的编码方式void |
setContentType(String type) | 如果尚未提交响应,则设置发送到客户端响应的内容类型。内容类型可以包括字符编码规范,例如text/html;charset=UTF-8 |
(1)基本概念
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
void sendRedirect(String location) | 使用指定的重定向位置URL向客户端发送临时重定向响应 |
// 继承HttpServlet
public class HelloWorld extends HttpServlet {
// 重写HttpServlet中的doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// 设置响应输出编码,避免中文乱码
response.setContentType(“text/html;charset=utf-8”);
// 获取响应输出流
PrintWriter out= response.getWriter();
// 利用输出流输出信息
out.println(“<html><body> Hello world!</body></html>”);
//关闭流
out.close();
}
}
接收之前设置编码方式:
request.setCharacterEncoding(“utf-8”)
提示:
必须在调用request.getParameter(“name”)之前设置
将接收到的中文乱码重新编码:
// 接收到get请求的中文字符串
String name = request.getParameter("name");
// 将中文字符重新编码,默认编码为ISO-8859-1
String userName = new String(name.getBytes(“ISO-8859-1”),“utf-8");
(1)基本概念
(2)配置方式
<servlet>
<servlet-name>actionservletservlet-name>
<servlet-class>com.lagou.demo01.ActionServletservlet-class>
<init-param>
<param-name>configparam-name>
<param-value>struts.xmlparam-value>
init-param>
servlet>
(3)常用的方法
方法声明 | 功能介绍 |
---|---|
String getServletName() | 返回Servlet的别名 |
String getInitParameter(String name) | 返回包含初始化参数值的字符串,如果该参数不存在,则返回null |
Enumeration getInitParameterNames() | 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举 |
ServletContext getServletContext() | 返回对调用方正在其中执行的ServletContext的引用 |
(1)基本概念
(2)配置方式
<context-param>
<param-name>usernameparam-name>
<param-value>scottparam-value>
<context-param>
<context-param>
<param-name>passwordparam-name>
<param-value>tigerparam-value>
<context-param>
(3)常用的方法
方法声明 | 功能介绍 |
---|---|
String getInitParameter(String name) | 返回包含初始化参数值的字符串,如果该参数不存在,则返回null |
Enumeration getInitParameterNames() | 将servlet的初始化参数的名称作为字符串对象的枚举返回,如果servlet没有初始化参数,则返回空枚举 |
String getRealPath(String path) | 返回包含给定虚拟路径的实际路径的字符串 |
String getContextPath() | 返回与此上下文关联的主路径 |
InputStream getResourceAsStream(String path) | 将位于指定路径的资源作为InputStream对象返回 |
void setAttribute(String name, Object object) | 将指定的属性名和属性值绑定到当前对象 |
Object getAttribute(String name) | 根据执行的属性名获取属性值 |
void removeAttribute(String name) | 删除指定的属性名信息 |
(1)重定向的概念
(2)重定向的实现
方法声明 | 功能介绍 |
---|---|
void sendRedirect(String location) | 使用指定的重定向位置URL向客户端发送临时重定向响应 |
(1)转发的概念
(2)转发的实现
方法声明 | 功能介绍 |
---|---|
Object getAttribute(String name) | 将指定属性值作为对象返回,若给定名称属性不存在,则返回空值 |
void setAttribute(String name,Object o) | 在此请求中存储属性值 |
方法声明 | 功能介绍 |
---|---|
RequestDispatcher getRequestDispatcher(String path) | 返回一个RequestDispatcher对象,该对象充当位于给定路径上的资源的包装器 |
方法声明 | 功能介绍 |
---|---|
void forward(ServletRequest request, ServletResponse response) | 将请求从一个servlet转发到服务器上的另一个资源(Servlet、JSP文件或HTML文件) |
(3)转发的特点
方法声明 | 功能介绍 |
---|---|
Cookie(String name, String value) | 根据参数指定数值构造对象 |
方法声明 | 功能介绍 |
---|---|
void addCookie(Cookie cookie) | 添加参数指定的对象到响应 |
方法声明 | 功能介绍 |
---|---|
Cookie[] getCookies() | 返回此请求中包含的所有Cookie对象 |
方法声明 | 功能介绍 |
---|---|
String getName() | 返回此Cookie对象中的名字 |
String getValue() | 返回此Cookie对象的数值 |
void setValue(String newValue) | 设置Cookie的数值 |
方法声明 | 功能介绍 |
---|---|
int getMaxAge() | 返回cookie的最长使用期限(以秒为单位) |
void setMaxAge(int expiry) | 设置cookie的最长保留时间(秒) 正数表示指定的描述后失效 数表示浏览器关闭后失效 0表示马上失效 |
方法声明 | 功能介绍 |
---|---|
void setPath(String uri) | 设置cookie的路径信息 |
方法声明 | 功能介绍 |
---|---|
HttpSession getSession() | 返回此请求关联的当前Session,若此请求没有则创建一个 |
方法声明 | 功能介绍 |
---|---|
boolean isNew() | 判断是否为新创建的Session |
String getId() | 获取Session的编号 |
方法声明 | 功能介绍 |
---|---|
Object getAttribute(String name) | 返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定,则返回空值 |
void setAttribute(String name, Object value) | 使用指定的名称将对象绑定到此会话 |
void removeAttribute(String name) | 从此会话中删除与指定名称绑定的对象 |
方法声明 | 功能介绍 |
---|---|
int getMaxInactiveInterval() | 获取失效时间 |
void setMaxInactiveInterval(int interval) | 设置失效时间 |
<session-config>
<session-timeout>30session-timeout>
session-config>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Timetitle>
head>
<body>
现在的时间是:<%= new Date()%>
body>
html>
<%! %>
<%!
int i;
public void setName(){
… …}
%>
<%程序代码区%>
<%
int j;
for (int k=0; k<10; k++) {
… …
}
%>
<%=… …%>
<%=“hello world”%>
<%=i+1%>
使用for循环输出一个html语言的表格,具体表头如下:
id name age salary
1 1 1 1
2 2 2 2
...
5 5 5 5
格式:
HTML文件的注释,浏览器可以查看到
<%--… …--%> JSP文件的注释,浏览器看不到
<%//… …%> Java语言中的单行注释,浏览器看不到
<%/*… …*/%> Java语言中的多行注释,浏览器看不到
注释的内容不会被执行
<%@指令 属性=“属性值”%>
(1)page指令
import 导入相应的包,惟一允许在同一文档中多次出现的属性
contentType 设置Content-Type响应报头,标明即将发送到浏览器的文档类型
pageEncoding 设置页面的编码
language 指定页面使用的语言
session 控制页面是否参与HTTP会话
errorPage 处理当前页面中抛出但未被捕获的任何异常
isErrorPage 当前页是否可以作为其他页面的错误处理页面
(2)taglib指令
<%@taglib uri=“tagLibary” prefix=“prefix”%>
(3)include指令
<%@include file=“被包含的文件地址%>
(4)jsp:include/jsp:param
<jsp:include page=“URLSpec” flush=“true”/>
<jsp:include page=“URLSpec” flush=“true”>
<jsp:param name=“key” value=“value”/>
jsp:include>
(5)include指令和include动作的区别
(6)jsp:forward/jsp:param
<jsp:forward page=“urlSpec” flush=“true”/>
<jsp:forward page=“urlSpec”>
<jsp:param name=“key” value=“value”/>
jsp:forward>
对象变量 | 对象类型 | 作用 |
---|---|---|
out | JSPWriter | 输出流 |
request | HttpServletRequest | 请求信息 |
response | HttpServletResponse | 响应信息 |
session | HttpSession | 会话 |
application | ServletContext | 全局的上下文对象 |
pageContext | PageContext | JSP页面上下文 |
page | Object | JSP页面本身 |
config | ServletConfig | Servlet配置对象 |
exception | Throwable | 捕获网页异常 |
方法声明 | 功能介绍 |
---|---|
void println(String x) | 向客户端输出各种类型数据 |
void newLine() | 输出一个换行符 |
void close() | 关闭输出流 |
int getBufferSize() | 返回缓冲区的大小 |
int getRemaining() | 返回缓冲区中未使用的字节数 |
void flush() | 输出缓冲区里的数据 |
void clearBuffer() | 清除缓冲区里的数据,同时把数据输出到客户端 |
void clear() | 清除缓冲区里的数据,但不把数据输出到客户端 |
方法声明 | 功能介绍 |
---|---|
String getMethod() | 返回客户端向服务器端传送数据的方式 |
String getParameter(String name) | 返回客户端向服务器端传送的参数值 |
String[] getParameterValues( Strin name) | 获得指定参数的所有值 |
String getRequestURI() | 获得请求地址 |
String getRemoteAddr() | 返回发送请求的客户端或最后一个代理的IP地址 |
int getRemotePort() | 返回发送请求的客户端或最后一个代理的端口号 |
String getServerName() | 获取服务器的名字 |
int getServerPort() | 获取服务器端的端口 |
void setAttribute(String name,Object o) | 在此请求中存储属性。属性在请求之间重置 |
Object getAttribute(String name) | 将指定属性的值作为对象返回,若不存在则返回空值 |
方法声明 | 功能介绍 |
---|---|
void addCookie(Cookie cookie) | 添加一个Cookie对象,用于在客户端保存特定的信息 |
void addHeader(String name, String value) | 添加HTTP头信息,该Header信息将发送到客户端 |
boolean containsHeader(String name) | 判断指定名字的HTTP文件头是否存在 |
void sendRedirect(String location) | 重定向JSP文件 |
void setContentType(String type) | 设置类型与编码方式 |
方法声明 | 功能介绍 |
---|---|
void setAttribute(String name, Object value) | 使用指定的名称将对象绑定到此会话 |
Object getAttribute(String name) | 返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定则返回空值 |
方法声明 | 功能介绍 |
---|---|
void setAttribute(String name, Object object) | 将对象绑定到此servlet上下文中的给定属性名 |
Object getAttribute(String name) | 返回给定名称的servlet容器属性,若没有该名称的属性返回null |
方法声明 | 功能介绍 |
---|---|
void setAttribute(String name, Object value, int scope) | 使用适当的作用域设置指定的名称和值 |
Object getAttribute(String name, int scope) | 返回指定作用域中名称关联的对象,若找不到则返回null |
ServletRequest getRequest() | 获取请求对象 |
ServletResponse getResponse() | 获取响应对象 |
HttpSession getSession() | 获取会话对象 |
ServletConfig getServletConfig() | 获取配置对象 |
JspWriter getOut() | 获取输出对象 |
Object getPage() | 获取页面对象 |
Exception getException() | 获取异常对象 |
<%@page errorPage="error.jsp" %>
<error-page>
<exception-type>java.lang.Throwableexception-type>
<location>/error.jsplocation>
error-page>
(1)基本概念
(2)使用方式
<jsp:useBean id=“对象名” scope=“保存范围 class=“包名.类名” />
保存范围有:page|request|sessin|application,默认为page范围。
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
<jsp:getProperty name="对象名" property="属性名"/>
(3)保存范围
(4)删除方式
<%
内置对象.removeAttribute(“JavaBean的名字”);
%>
(javaweb.task03_demo03)
编程题
使用前端、数据库、JavaWeb 等技术并采用 MVC 设计模式实现学生信息管理系统,要求使用管理员账号密码登录后进行学员信息增加、学员信息修改、学员信息删除、学员信息查找、学员信息显示功能。
其中学生信息有:学号、姓名、性别、出生日期、邮箱、备注
要求:
(1)访问方式
${param.name}
${paramValues.hobby[0]}
(1)访问方式
(2)主要区别
<%
request.setAttribute(“prop”,“age”);
%>
${ user[prop] }
${student[0].name}
类别 | 标识符 | 描述 |
---|---|---|
JSP | pageContext | PageContext 处理当前页面 |
作用域 | pageScope | 同页面作用域属性名称和值有关的Map类 |
requestScope | 同请求作用域属性的名称和值有关的Map类 | |
sessionScope | 同会话作用域属性的名称和值有关的Map类 | |
applicationScope | 同应用程序作用域属性的名称和值有关的Map类 | |
请求参数 | param | 根据名称存储请求参数的值的Map类 |
paramValues | 把请求参数的所有值作为一个String数组来存储的Map类 | |
请求头 | header | 根据名称存储请求头主要值的Map类 |
headerValues | 把请求头的所有值作为一个String数组来存储的Map类 | |
Cookie | cookie | 根据名称存储请求附带的cookie的Map类 |
初始化参数 | initParam | 根据名称存储Web应用程序上下文初始化参数的Map类 |
(1)常用的算术运算符
算术运算符 | 说 明 | 范 例 | 运算结果 |
---|---|---|---|
+ | 加 | ${1+2} | 3 |
- | 减 | ${2-1} | 1 |
* | 乘 | ${2*3} | 6 |
/ 或 div | 除 | ${16/5}或${16div5} | 3.2 |
% 或 mod | 取余 | ${16%5}或${16mod5} | 1 |
(2)常用的关系运算符
关系运算符 | 说 明 | 范 例 | 运算结果 |
---|---|---|---|
==或 eq | 等于 | ${1==2}或${1 eq 2} | false |
!= 或 ne | 不等于 | ${2!=1}或${1 ne 2} | true |
< 或 lt | 小于 | ${2<3}或${2 lt 3 } | true |
> 或 gt | 大于 | ${16>5}或${16 gt 5} | true |
<= 或 le | 小于等于 | ${16<=5}或${16 le 5} | false |
>= 或 ge | 大于等于 | ${16>=5}或${16 ge 5} | true |
(3)常用的逻辑运算符
逻辑运算符 | 说 明 | 范 例 | 运算结果 |
---|---|---|---|
&& 或 and | 与运算 | ${true&&true}或${true and true} | true |
|| 或or | 或运算 | ${true||false}或${true or false} | true |
! 或not | 非运算 | ${!true}或${not true } | false |
(4)条件运算符
${条件表达式? 语句1 : 语句2}
(5)验证运算符
${empty 表达式}
返回布尔值判断表达式是否为"空"值,null值、无元素的集合或数组、长度为零的String被认为是空值。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
(1)输出标签
用来将指定内容输出的标签
(2)设置标签
用来设置属性范围值的标签
(3)删除标签
用来删除指定数据的标签
(4)单条件判断标签
满足条件执行
(5)多条件判断标签
满足条件执行
…
不满足上述when条件时执行
(6)循环标签
…
<%
// 准备一个数组并初始化
String[] sArr = {"11","22","33","44","55"};
pageContext.setAttribute("sArr",sArr);
%>
<%-- 使用循环标签遍历数组中的所有元素--%>
<%-- 跳跃性遍历 间隔为2 也就是 跳过一个遍历一个 --%>
<%--11 33 55--%>
<%-- 指定起始和结尾位置 从下标1开始到3结束 --%>
<%--22 33 44--%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
pageContext.setAttribute("var","Hello World!");
%>
原始字符串为:${var}
<%--Hello World!--%>
判断该字符串是否包含指定字符串的结果为:${fn:contains(var,"Hello")}
<%--true--%>
将字符串中所有字符转换为大写的结果为:${fn:toUpperCase(var)}
<%--HELLO WORLD!--%>
将字符串中所有字符转换为小写的结果为:${fn:toLowerCase(var)}
<%--hello world!--%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%
// 获取当前系统时间
Date date = new Date();
pageContext.setAttribute("date",date);
%>
当前系统时间为:${date}
public class HelloTag extends SimpleTagSupport {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out = this.getJspContext().getOut();
out.println("自定义标签的参数为:" + name);
}
}
<tag>
<name>helloTagname>
<tag-class>com.lagou.demo02.HelloTagtag-class>
<body-content>emptybody-content>
<attribute>
<name>namename>
<required>truerequired>
attribute>
tag>
<%@ taglib prefix="hello" uri="http://lagou.com" %>
import javax.servlet.Filter;
public class LoginFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {
//TODO 处理逻辑,必须调用下面的方法
//相当于放行,到web服务器
chain.doFilter(request,response);
}
}
<filter>
<filter-name>LoginFilterfilter-name>
<filter-class>com.lagou.LoginFilterfilter-class>
filter>
<filter-mapping>
<filter-name>LoginFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
(1)基本概念
(2)常用的方法
方法声明 | 功能介绍 |
---|---|
void init(FilterConfig filterConfig) | 实现过滤器的初始化操作 |
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) | 执行过滤操作的功能 |
void destroy() | 实现过滤器的销毁操作 |
(1)基本概念
(2)常用方法
方法声明 | 功能介绍 |
---|---|
String getFilterName() | 获取过滤器的名字 |
String getInitParameter(String name) | 获取指定的初始化参数信息 |
Enumeration getInitParameterNames() | 获取所有的初始化操作名称 |
ServletContext getServletContext() | 获取ServletContext对象 |
监听器类型 | 功能介绍 |
---|---|
javax.servlet.ServletRequestListener | 监听request作用域的创建和销毁 |
javax.servlet.ServletRequestAttributeListener | 监听request作用域的属性状态变化 |
javax.servlet.http.HttpSessionListener | 监听session作用域的创建和销毁 |
javax.servlet.http.HttpSessionAttributeListener | 监听session作用域的属性状态变化 |
javax.servlet.ServletContextListener | 监听application作用域的创建和销毁 |
javax.servlet.ServletContextAttributeListener | 监听application作用域的属性状态变化 |
javax.servlet.http.HttpSessionBindingListener | 监听对象与session的绑定和解除 |
javax.servlet.http.HttpSessionActivationListener | 监听session数值的钝化和活化 |
(1)ServletRequestListener监听器
方法声明 | 功能介绍 |
---|---|
void requestInitialized(ServletRequestEvent sre) | 实现ServletRequest对象的初始化 |
void requestDestroyed(ServletRequestEvent sre) | 实现ServletRequest对象的销毁 |
<listener>
<listener-class>com.lagou.demo03.MyRequestListenerlistener-class>
listener>
(2)ServletRequestAttributeListener监听器
方法声明 | 功能介绍 |
---|---|
void attributeAdded(ServletRequestAttributeEvent srae) | 增加属性时触发 |
void attributeReplaced(ServletRequestAttributeEvent srae) | 修改属性时触发 |
void attributeRemoved(ServletRequestAttributeEvent srae) | 删除属性时触发 |
<listener>
<listener-class>com.lagou.demo03.MyRequestAttributeListenerlistener-class>
listener>
(3)HttpSessionListener监听器
方法声明 | 功能介绍 |
---|---|
void sessionCreated(HttpSessionEvent se) | 当一个HttpSession对象被创建时会调用这个方法 |
void sessionDestroyed(HttpSessionEvent se) | 当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法 |
<listener>
<listener-class>com.lagou.demo03.MySessionListenerlistener-class>
listener>
<session-config>
<session-timeout>1session-timeout> //session有效时间设置为1分钟
session-config>
(4)HttpSessionAttributeListener监听器
方法声明 | 功能介绍 |
---|---|
void attributeAdded(HttpSessionBindingEvent se) | 当往会话中加入一个属性的时候会调用这个方法 |
void attributeRemoved(HttpSessionBindingEvent se) | 当从会话中删除一个属性的时候会调用这个方法 |
void attributeReplaced(HttpSessionBindingEvent se) | 当改变会话中的属性的时候会调用这个方法 |
<listener>
<listener-class>com.lagou.demo03.MySessionAttributeListenerlistener-class>
listener>
(5)ServletContextListener监听器
方法声明 | 功能介绍 |
---|---|
void contextInitialized(ServletContextEvent sce) | 当ServletContext创建的时候,将会调用这个方法 |
void contextDestroyed(ServletContextEvent sce) | 当ServletContext销毁的时候(例如关闭应用服务器或者重新加载应用),将会调用这个方法 |
<listener>
<listener-class>com.lagou.demo03.MyContextListenerlistener-class>
listener>
(6)ServletContextAttributeListener监听器
方法声明 | 功能介绍 |
---|---|
void attributeAdded(ServletContextAttributeEvent scae) | 往ServletContext中加入一个属性的时候触发 |
void attributeRemoved(ServletContextAttributeEvent scae) | 从ServletContext中删除一个属性的时候触发 |
void attributeReplaced(ServletContextAttributeEvent scae) | 改变ServletContext中属性的时候触发 |
<listener>
<listener-class>com.lagou.demo03.MyContextAttributeListenerlistener-class>
listener>
(7)HttpSessionBindingListener监听器
方法声明 | 功能介绍 |
---|---|
void valueBound(HttpSessionBindingEvent event) | 有对象绑定时调用该方法 |
void valueUnbound(HttpSessionBindingEvent event) | 有对象解除绑定时调用该方法 |
(8)HttpSessionActivationListener监听器
方法声明 | 功能介绍 |
---|---|
void sessionWillPassivate(HttpSessionEvent se) | 有钝化操作时调用该方法 |
void sessionDidActivate(HttpSessionEvent se) | 有活化操作时调用该方法 |
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="true">
<Store className="org.apache.catalina.session.FileStore" directory="C:\session"/>
Manager>
自定义类实现监听器接口并重写相关的方法。
实现HttpSessionListener,HttpSessionListener接口的目的
实现监听会话的创建和销毁
实现监听ServletContext的创建和销毁
由于浏览器向服务器发出一个请求之后服务器就会创建一个Session对象,本质上在内存中申请一块空间,把Session信息已cookie的方式发给浏览器,即只要有一个浏览器访问我们的服务器的时候就会创建一个Session,有多少个浏览器访问服务器就会有多少个Session,一个浏览器代表一个用户,那么多少个Session就代表多少个用户。监听session的创建和销毁,即在线用户的增加和减少。但无论增加或减少都要保存到ServletContext里,因为一个web项目对应唯一的一个对象,用它记录在线用户因为项目是唯一的记录出来的值也是唯一的
public class OnlineUser implements HttpSessionListener,ServletContextListener {
ServletContext ctx = null;
// 初始化ServletContext
public void contextInitialized(ServletContextEvent e) {
ctx = e.getServletContext();
}
// 销毁ServletContext
public void contextDestroyed(ServletContextEvent e) {
//将ServletContext设置成null;
}
// 当新创建一个HttpSession对象时
public void sessionCreated(HttpSessionEvent e) {
//将当前的在线人数加上1,并且保存到ServletContext(application)中
}
// 当一个HttpSession被销毁时(过期或者调用了invalidate()方法)
public void sessionDestroyed(HttpSessionEvent e) {
//将当前人数减去1,并且保存到ServletContext(application)中
}
}
<listener>
<listener-class> com.lagou.listener.OnlineUser listener-class>
listener>
Filter过滤器
基本概念,工作方式,使用方式,Filter接口,FilterConfig接口,多个过滤器的使用,优点
Listener监听器
基本概念,基本分类,实战案例
目录名称 | 功能介绍 |
---|---|
/ | 跟目录 |
~ | 主目录 (当前用户所在的主目录,即/home)(因为Linux支持多用户的,可以开很多用户,防止这些用户之前起冲突,给每个用户分配了主目录/home,即分配了一个地盘,可以在自己的地盘上胡作非为,敌人的地盘就不能踩过去没有权限,防止了互相影响你把我的文件删了我把你的文件删了) |
/bin | binarie:存放二进制可执行文件 (例如tomcat的bin目录) |
/sbin | super binaries:存放二进制文件,只有root用户才能访问 |
/boot | 系统启动核心目录,存放系统启动程序文件,例:查看启动文件的大小 |
/dev | devices:用于存放硬件设备文件 |
/etc | etcetera:存放系统配置文件(字体文件等) |
/home | 家目录,每一个用户都有一个”家”,用户的起始目录,创建用户跟随创建相应的家目录 |
/lib | library:系统资源文件类库 |
/proc | 内存映射目录,可以查看系统相关硬件的信息 |
/var | variable:可变的,变量. 部署项目用的 |
/tmp | temporary:用来存放临时文件 |
/root | 超级用户root的家目录 |
/usr | unix shared resouce: 存放unix共享系统资源,类似于” C:/ Program Files”,用于安装各种软件 |
(1)查看目录下文件/目录
命令 | 功能描述 |
---|---|
ls | list显示文件 |
ls -l 或 ll | list -list显示详细信息 |
ls -a | list -all显示全部(包含隐藏文件)文件 |
ls -al | list -all list 上两个合体 |
ls 目录名 | 查看目录下有什么东西 |
. : 当前目录
… : 上一级目录
(2)目录切换
命令 | 功能描述 |
---|---|
cd … | 上一级目录 |
cd dirname | 进入目录 |
cd 或 cd ~ | 直接回到用户的家目录 |
cd / | 回到系统根目录 |
(3)查看完整路径
命令 | 功能描述 |
---|---|
pwd | 查看当前目录所在的位置 print work directory |
(4)查看当前用户
命令 | 功能描述 |
---|---|
whoami | 查看当前用户的名称 |
(5)用户切换
命令 | 功能描述 |
---|---|
su | 普通用户切换到root用户 switch user |
su root | 切换到root用户 |
su 用户名 | 切换到普通用户 |
exit | 退回到原来用户 |
(6)管理用户
命令 | 功能描述 |
---|---|
useradd xxx | 创建用户 |
passwd xxx | 为创建的用户设置密码 |
userdel xxx | 删除用户,userdel -r xxx 主目录也一起删掉 |
(7)查看命令的所在目录
命令 | 功能描述 |
---|---|
which 命令 | 查看指定命令所在的路径信息 |
(8)文件操作
命令 | 功能描述 |
---|---|
touch fileName | 创建名字为fileName的文件 |
touch dir/fileName | 在dir目录下创建名字为fileName的文件 |
echo 内容 > fileName | 把内容覆盖写到文件中,若文件不存在则创建 |
echo 内容 >> fileName | 把内容追加到文件中 |
cat fileName | 打印文件内容到终端 |
more fileName | 分屏查看文件各行内容,不支持回看, enter一行一行,spacebar一页一页,q退出 |
less fileName | 查看文件各部分内容,支持回看 使用上下左右键查看,q退出 |
head -n fileName | 查看文件的前n行内容 |
tail -n fileName | 查看文件末尾n行内容 |
wc fileName | 查看文件的行数 |
(9)目录操作
命令 | 功能描述 |
---|---|
mkdir 目录名 | 创建普通文件夹 |
mkdir -p 目录/目录/目录 | 递归方式创建多级父子文件夹 |
mv dir1 dir2 | 将dir1移动到dir2中 |
mv dir1/dir2 ./ | 将dir1中dir2移动到当前目录下 |
mv dir1 name | 将dir1改名为name |
cp dir1 name | 将dir1拷贝为name(拷贝文件) |
cp -r dir1 dir2 | 需要设置参数 -r (recursive递归) 无视目录层次(拷贝目录) |
rm 文件 | 删除文件 |
rm -r 目录 | 递归删除目录(无视目录层次) |
rm -rf 文件/目录 | -r force(强制) 删除文件/目录 |
(10)查找操作
命令 | 功能描述 |
---|---|
find / -name passwd[完整名称] | 查找passwd文件 |
find ./ -name “p*” | 查找带”p”的文件 |
find ./ -type f | 查找所有文件 |
grep 内容 fileName | 从指定文件中查找指定的内容 |
(11)权限管理
命令 | 功能描述 |
---|---|
chmod 权限 文件/目录名 | 管理指定文件的权限信息,r读:4 w写:2 x执行:1 |
chmod u+x b.txt
chmod g+x b.txt
chmod o+wx b.txt
chmod o-wx b.txt
chmod 664 b.txt
chmod 777 b.txt
(12)进程管理
命令 | 功能描述 |
---|---|
ps | 查看当前终端窗口里的进程 |
ps -aux | 查看系统中的所有进程 |
ps -ef | 查看进程列表 |
kill 进程号 | 杀死指定的进程 |
kill -9 进程号 | 强制杀死指定的进程 |
(13)其它命令
命令 | 功能描述 |
---|---|
ifconfig | 查看当前系统的IP地址等信息 |
tar -zcvf 压缩文件名.tar.gz 路径1 路径2 … | 实现一组文件或文件夹的打包 |
tar -zxvf 压缩文件名.tar.gz | 实现解压缩解包 |
man [章节号] 命令/函数名 | 查询指定的命令或函数 |
(1)命令模式的编辑命令
i:在当前位置之前插入 (光标位置不变)
a:在当前位置之后插入 (光标往后移一个)
o:在当前行下插入 (跑到下一行)
(2)命令行模式的删除命令
x 删除一个字符
dw 删除当前词
3dw 删除三个词
dd 删除当前行
5dd 删除五行
(3)命令行模式的修改命令
r 替换一个字符
cw 替换一个单词
cc 替换一行
C 替换从光标至行尾
(4)命令行模式的拷贝命令
yw 拷贝词
yy 拷贝行(或Y)
dd 剪切行
p 当前行下粘贴
u 撤销
ctrl+r 取消撤销
(5)底行模式的命令
:w 存盘
:w newfile 存成新文件
:wq 存盘退出Vi(或ZZ,或:x)
:q! 强行退出不存盘
:1,2co3 拷贝行1,行2在行3之后
:4,5mo6 移动行4,行5在行6之后
:%s /源字符串/目标字符串
:%s /源字符串/目标字符串/g 替换每一行中的所有
(6)注意使用
(1)下载和安装方式
(2)使用方式
(3)网络模式设置
(4)修改配置文件
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.8.128 //IP地址
GATEWAY=192.168.8.2 //网关
NETMASK=255.255.255.0 //子网掩码
DNS1=114.114.114.114
(5)配置文件生效
使用命令使得配置文件生效:service network restart
(1)下载和安装方式
(2)配置环境变量
vi /etc/profile
到文件的最下面,输入o,进入编辑模式,写入下面两行代码
- export:导入
- JAVA_HOME:变量
- $JAVA_HOME:把JAVA_HOME的值拿出来
- ::路径分隔符
export JAVA_HOME=/usr/javajdk
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile 表示让这个配置文件立即生效
javac 测试是否成功,打出一堆东西表示成功
javac -version javac 版本
(1)下载和安装方式
(2)启动和关闭方式
cd /usr/tomcat/bin
./startup.sh 回车运行 打印一句话Tomcat started.
./shutdown.sh 回车关闭
(3)开放防火墙端口
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT 开启8080端口(暂时开通,重启系统就没了)
(4)配置环境变量 不作
export CATALINA_HOME=/usr/tomcat
export PATH=$CATALINA_HOME/bin:$PATH
source /etc/profile
startup.sh
(5)发布Web项目
(1)下载Mysql的repo源
wget:下载
repo源:安装Mysql步骤的快照
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
(2)安装rpm包
解析快照文件 (community:免费版)
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
集成在快照里面
(3)安装Mysql
yum:智能安装(安装包的管理器工具)
yum install mysql-server
y
y
y
rpm:类似手机上的应用商店,软件包的管理工具,通过他可以实现软件的自动安装
下面代码表示通过rpm查看里面的软件管理工具所安装的所有的软件信息或者包信息,grep(查找) mysql
rpm -qa | grept mysql
(4)启动服务
service mysqld start
显示一下信息,启动成功
Redirecting to /bin/systemctl start mysqld.service
(5)查看服务状态
自动安装时,配置了一个随机的密码,查找密码
grep password /var/log/mysqld.log
systemctl status mysqld
(6)使用root用户登录
mysql -u root
(7)修改临时密码
alter user 'root'@'localhost' identified by 'StOne@222';
(1)使用SQLyog工具
(2)解决方案
mysql -u root -p
use mysql;
select user,host from user;
select host from user where user='root';
update user set host='%' where user='root';
flush privileges;
select user,host from user;
放开3306端口,在根目录下
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
重启生效
service iptables restart
(1)语法格式
(2)定义规则
(1)算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` 结果为 30。 |
- | 减法 | `expr $a - $b` 结果为 -10。 |
* | 乘法 | `expr $a * $b` 结果为 200。 |
/ | 除法 | `expr $b / $a` 结果为 2。 |
% | 取余 | `expr $b % $a` 结果为 0。 |
= | 赋值 | `a=$b` 将把变量b的值赋给a。 |
== | 相等。用于比较两个数字,相同则返回true。 | `[ $a == $b ]` 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回true。 | `[ $a != $b ]` 返回 true |
#!/bin/bash
#定义两个变量
ia=5
ib=2
#打印两个变量的数值
echo "ia=$ia"
echo "ib=$ib"
#实现加法运算,要求+两边必须有空格
echo `expr $ia + $ib`
#使用其他方法实现加法运算
ic=$[$ia+$ib]
echo $ic
id=$(($ia+$ib))
echo $id
-----------------------------sh arithmetic.sh
ia=5
ib=2
7
7
7
(2)关系运算符
运算符 | 说明 | 英文 | 举例 |
---|---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | equal | `$a -eq $b` 返回false |
-ne | 检测两个数是否不相等,不相等返回 true。 | not equal | `$a -ne $b` 返回true |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | greater than | `$a -gt $b` 返回false |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | less than | `$a -lt $b` 返回true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回true。 | greater than or equal to | `$a -ge $b` 返回fasle |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | less than or equal to | `$a -le $b` 返回 true |
(1)if判断
if [ 条件判断式 ]
then
程序
fi
#!/bin/bash
#定义一个变量用于描述考试成绩
score=60
echo $score
#使用if判断给出及格或者不及格的提示信息
if [ $score -gt 60 ]
then
echo "恭喜考试通过了!"
elif [ $score -eq 60 ]
then
echo "60分万岁,对一份浪费!"
else
echo "下学期再来吧!"
fi
(2)case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
#!/bin/bash
#提示用户输入1~4之间的整数并记录到变量中
echo "请输入0~4之间的整数:"
read num #表示读取一个整数放到变量num中
#使用case语句进行批评和打印
case $num in
1) echo "你选择了1号业务!"
;;
2) echo "你选择了2号业务!"
;;
3) echo "你选择了3号业务!"
;;
4) echo "你选择了4号业务!"
;;
*) echo "你没有选择1~4号之间的业务,你想干啥?"
;;
esac
(3)for循环
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
#!/bin/bash
#定义一个变量负责记录累加和
sum=0
#使用for循环计算1~100之间的累加并记录到上述变量中
for(( i=1;i<=100;i++ ))
do
sum=$[$sum+$i]
done
#答应变量的数值
echo $sum
(4)while循环
while [ 条件判断式 ]
do
程序
done
#!/bin/bash
#使用while循环实现1~100之间的累加和
#定义两个变量分别记录累加和与初始值
sum=0
i=1
#使用while循环
while [ $i -le 100 ]
do
sum=$[$sum+1]
i=$[$i+1]
done
#打印结果
echo $sum
[ function ] funname[()]
{
Action;
[return int;]
}
funname
#!/bin/bash
#定义一个函数负责计算两个输入数据的和并答应
function sum()
{
s=$[$1+$2]
echo $s
}
#提示用户从键盘输入两个数据
read -p "input num1:" num1
read -p "input num2:" num2
#调用函数
sum $num1 $num2
编程题
使用 EL+JSTL 表达式、过滤器和监听器对第四阶段模块一的作业进行技术升级,
使用 Cookie 实现一周内免登录,
再增加班级管理功能:创建班级、修改班级信息、删除班级(前提:保证班级内没有关联学生)、查询班级, 此时需要为学生表增加字段:所属班级编号。
其中班级信息有:班级名称、年级、班主任名称、班级口号 、班级人数
要求: a.将项目部署到 Linux 系统中并通过本地浏览器能正常访问。
作业说明:
1、提供可运行的编程代码和sql脚本,代码记得要加注释,方便导师能通过浏览代码明白你的程序执行流程;
2、提供程序运行和讲解的视频(程序运行包含:按照作业要求体现程序执行结果;讲解内容包含:题目分析、实现思路、代码讲解。)
3、当前模块学习过程中的笔记,可以以文档、照片、思维导图的形式提供;
4、本次作业的内容,分三个文件夹,code(每个题单独一个文件夹)、运行视频、学习笔记;
list为原先的总集合,newlist为获取特定区域后集合,pageindex表示选择的特定页码数据,每页十条
if(pageIndex*10>list.size()){newlist=list.subList((pageIndex-1)*10, list.size());
}else{
newlist=list.subList((pageIndex-1)*10, pageIndex*10);
}
注意newList虽然为新的集合但是修改newList中的数据,list中的数据同样改变
String module = (String) getServletConfig().getServletContext().getAttribute("module");