一、Servlet
- servlet是JavaEE的重要组件之一
- 用于前台页面与后台的交互
- Servlet是一个java类,继承于HttpServlet
- Servlet要依托于tomcat运行
二.Tomcat目录
- bin:启动目录
- conf : 配置文件目录
- lib : jar目录
- logs : 日志目录
- temp : 临时文件目录
- webapps : 存放web项目
- work : 工作目录,存放jsp转servlet文件
三.论/的重要性
- web.xml里,url-pattern必须要加/
- 页面form的Action里面不要加/
四. Servlet返回中文
response.setCharacterEncoding("UTF-8");
response.getWriter().write("
"<html>\r\n" +
"<head>\r\n" +
"<meta charset=\"UTF-8\">\r\n" +
"</head>\r\n" +
"<body>\r\n" +
"Hello world!<hr>\r\n" + "你好"+
"</body>\r\n" +
"</html>");
五. Get与Post请求的区别
- form表单默认是get
- get提交会用?把参数拼接在url地址后面,参数与参数之间用&,不安全
- post提交数据,参数会单独放在请求体里,安全性高
- get请求的url有长度限制,post没有
- get请求只支持ASCII字符提交,post没有限制
六. 创建servlet
- 先创建一个class,继承于HttpServlet
public class MyFirstServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse response) throws ServletException, IOException {
System.out.println(“提交的方式:”+ arg0.getMethod());
}
} - 在web.xml里,配置servlet
myFirstServlet
com.igeek.excellence.servlet.MyFirstServlet
myFirstServlet
/xx
七. Servlet从页面到后台的访问流程
- Form表单提交,通过action去web.xml里匹配相应的url-pattern
- 会得到servlet-name,通过servlet-name能获取到是哪个servlet,再通过全经名找到相应的servlet类
- 会执行到servlet类里的service()方法,可以通过request获取请求里的参数,通过respone返回内容到页面
八. Servlet生命周期
- Tomcat容器启动时,不会加载Servlet
- 当一个用户访问这个servlet,它会先实例化,再初始化,然后执行service
- 下一个用户,不会实例化和初始化该servlet,直接执行service
- 当容器关闭或该servlet改动时,会执行destroy
九. 去掉网页url里面的项目名
右击项目,选择properties
十. 通过注解创建servlet
- servlet3.0之后支持注解功能,省去了web.xml里的复杂配置
- servlet类上加上注解:
@WebServlet(value="/ThreeServlet",name=“threeServlet”) - name相当于web.xml里的servlet-name,value相当于web.xml里的url-pattern
十一. 转发与重定向的区别
//重定向(客户级别)
response.sendRedirect("html/registerSuccess.html");
//转发(服务器级别)
request.getRequestDispatcher("html/registerSuccess.html")
.forward(request, response);
- 转发是由request调用的,重定向是由response调用的
- 转发网址是不会改变的,重定向网址会改变
- 转发只能访问项目内部网页,重定向可以访问第三方的网页
- 转发它会携带request作用域,可以携带参数
- 转发属于服务器级别,可以访问web-inf下的网页
十二. JS的页面跳转
- Js的跳转
window.location.href=“login.html”; - Jquery的跳转
$(location).prop(“href”,“login.html”);
十三. 过滤器
- 是JavaEE的标准组件之一
- 是用来过滤发往servlet的请求
- 是一个实现了Filter接口的类
@WebFilter(value= {"/MyServlet","/TwoServlet"})
public class TwoFilter implements Filter {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//把ServletRequest转换成HttpServletRequest
HttpServletRequest re = (HttpServletRequest) request;
//可以通过转换后的request获取各类参数
chain.doFilter(request, response);
}
}
十四. 字符编码过滤器
- 在web.xml里添加
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
UTF-8
forceEncoding
true
characterEncodingFilter
/*
十五. 过滤器的生命周期
- tomcat容器启动时,会先实例化,再初始化
- 访问过滤的servlet时,会调用doFilter方法
- 容器销毁或修改filter时,会调用destroy方法
十六. Cookie
- 在客户浏览器端保存用户数据
- 用户再登录网页时会携带cookie里的数据
新增cookie:
Cookie cookie = new Cookie(name, pwd);
//设置cookie的失效时间 1个月
cookie.setMaxAge(130246060);
response.addCookie(cookie);
获取cookie:
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
String value = cookie.getValue();
}
}
十七. 使用Log4j记录日志
日志级别:
Error : 错误
Info : 业务日志
Debug : 调试
Warning : 警告
级别从高到低(选择了高级别就不会打印低于它级别的日志):
Error warning info Debug
Logger log = Logger.getLogger(TestLog.class);
log.error("系统炸了");
log.info("系统运行稳定");
log.debug("系统进行调试");
log.warn(“系统警告”);
十八. JSP
- JSP是java的专属网页。以.jsp结尾
- JSP组成:html+css+js + java
- JSP不能单独展示,要运行在tomcat容器中
- JSP本质是一个servlet
十九. JSP执行过程
- JSP文件会通过tomcat自带的servlet容器,把jsp文件转换成相应的servlet类(.java文件)
- 会把.java文件编译成.class文件
- 交于JVM写出相应的网页
二十. JSP三大指令
- 编译器指令
1.1 Page指令:
1.1.1 指定编码,文件格式:
<%@ page language=“java” contentType=“text/html; charset=utf-8”
pageEncoding=“utf-8”%>
1.1.2 导入相应jar包:
<%@ page import=“java.util.Random”%>
1.1.3 出错跳转的页面
<%@ page errorPage=“err.html” %>
1.2 Taglib指令,添加命名空间:
1.2.1页面添加Jstl标签库
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
1.3 Include静态导入指令:
<%@ include file=“Two.jsp” %>
- 语法指令
2.1 页面输出
<% String str = “极客卓越”; %>
<%=str %>
2.2 声明全局变量和方法 <%! String strs = "极客巅峰"; %> <%! public String eat(){ return "晚上吃肉!"; } %><%= eat() %>
3. 动作指令
3.1 页面输出
<% String str = “极客卓越”; %>
str
3.2 动态导入 3.3 页面跳转二十一. contentType,pageEncoding,charset区别
- contentType:相当于jsp本身的格式,通知servlet容器该jsp以什么编码转换为servlet
- pageEncoding : Jsp的指令属性,告诉servlet以什么编码输出给用户看
- charset : Html的meta标签属性,该HTML以什么编码展示
二十二. 静态导入与动态导入的区别
1. 静态导入属于编译器指令,动态导入输入动作指令
2. 静态导入,会把两个Jsp页面编译成一个servlet,不能有同名的属性和方法名
3. 动态导入,两个jsp会编译成两个servlet,两个servlet的同名变量和方法不会冲突
4. 静态导入以文件路径,动态导入以访问路径
二十三. 隐式注释与显式注释的区别
- 显式注释 -针对于浏览器而言,jsp编译器不认
- 隐式注释 -针对于jsp编译器的
<%-- 隐式注释 --%>
二十四. JSP九大内置对象
- request:客户端的请求
- response:服务端的响应
- pageContext:JSP的上下文,可以通过它获取其他八大对象
- session : 服务端保存用户信息
- application :Servlet的上下文,保存全局参数
- config :存放配置参数
- out : 服务器向页面输出的流对象
- page : 页面本身,相当于this
- exception : 页面中捕获的异常,针对于错误网页
二十五. JSP四大作用域
-
Application:项目不关闭,作用域就一直存在,通常存放系统参数
-
Session : 用户浏览器不关闭,作用域就不会消失
-
Request : 当前页面与下一个转发页面作用域会存在
-
pageContext :当前页面作用域会存在
getServletContext().setAttribute("name", "宗伟"); request.setAttribute("name", user.getName()); request.getSession().setAttribute("name", "彭辉");
<% pageContext.setAttribute(“name”, “王科”); %>
二十六. JSP页面输出的3种方式
<%=application.getAttribute("name") %>
<jsp:expression>application.getAttribute("name")</jsp:expression>
<% out.println(application.getAttribute("name")); %>
二十七. EL表达式
1.为了简化jsp从四大作用域取值
<h1>恭喜<%=session.getAttribute("name") %>注册成功!!</h1>
<h1>恭喜 ${sessionScope.name} 注册成功!!</h1>
<h1>恭喜 ${applicationScope.name} 注册成功!!</h1>
<h1>恭喜 ${requestScope.name} 注册成功!!</h1>
<h1>恭喜 ${pageScope.name} 注册成功!!</h1>
2.取值顺序:page>request > session > application
<h1>恭喜 超级简化版 ${name} 注册成功!!</h1>
- EL对象与集合取值
<h1>EL表达式-对象取值:${user.getName()} </h1>
<h1>EL表达式-对象取值:${user.name} </h1>
4.EL取值判断
<h1>EL表达式-取值判断:${pwd !=null?pwd:"没有密码"} </h1>
<h1>EL表达式-为空判断:${empty pwd} </h1>
<h1>EL表达式-算法运算:${i+j} </h1>
<h1>EL表达式-单纯拼接:${i}${j} </h1>
<h1>EL表达式-逻辑判断:${i > j} </h1>
<h1>EL表达式-逻辑判断:${i == j} </h1>
<h1>EL表达式-逻辑判断:${i eq j} </h1>
二十八. JSTL标签库
- 它是一个开源的标签库
- 简化JSP的页面开发,通常配合EL表达式进行业务逻辑处理
- C标签库是JSTL的核心标签库,也是开发最常用的标签库
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
- 页面输出
<c:out value="${pwd}" default=“宗伟”></c:out>
- 在session设值
<c:set var=“sex” value=“男” scope=“session”></c:set>
- 逻辑判断
<c:if test="${ sex == ‘男’}">
好男儿志在四方
</c:if>
- 多层逻辑判断
<c:choose>
<c:when test=" s e x = = ′ 男 ′ " > < h 1 > 好 男 儿 志 在 四 方 < / h 1 > < / c : w h e n > < c : w h e n t e s t = " {sex == '男'}"> <h1>好男儿志在四方</h1> </c:when> <c:when test=" sex==′男′"><h1>好男儿志在四方</h1></c:when><c:whentest="{sex == ‘女’}">
巾帼不让须眉
</c:when>
<c:when test="${sex == ‘人妖’}">
萨瓦迪卡
</c:when>
</c:choose> - 循环取值
<c:forEach var=“xx” items="${list}" >${xx.name}
</c:forEach>
6. 分割取值
<% request.setAttribute(“ages”, “20,30,33,44,55”); %>
<c:forTokens items="
a
g
e
s
"
d
e
l
i
m
s
=
"
,
"
v
a
r
=
"
a
g
e
"
>
<
h
1
>
年
龄
:
{ages}" delims="," var="age"> <h1>年龄:
ages"delims=","var="age"><h1>年龄:{age}
</c:forTokens>
7. 移除参数
<c:remove var=“sex”/>
二十九. Ajax
静态网页请求,不同于Form表单提交时跳转,Ajax可以进行静态的局部网页刷新
$.ajax({
url:"/LoginServlet",
type:“get”,
async:true,//是否异步请求
success:function(data){
alert(data);
}
});
$.post("/TestServlet",{"name":"宗伟","pwd":"123"},
function(data){
alert(data);
});
三十. 监听器
-
监听器也是JavaEE的重要组件之一
-
是用来监听三大作用域(request,session,application)的状态和值,当发生改变时会触发相应的事件
Application:
public class MyApplicationListener implements ServletContextListener,ServletContextAttributeListener{@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("—Apllication销毁----");
}@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("----Apllication初始化----");
}@Override
public void attributeAdded(ServletContextAttributeEvent event) {
System.out.println("----Apllication 新增----");
}@Override
public void attributeRemoved(ServletContextAttributeEvent event) {
System.out.println("----Apllication 移除----");
}@Override
public void attributeReplaced(ServletContextAttributeEvent event) {
System.out.println("----Apllication 替换----");
}}
Session:
public class MySessionListener implements HttpSessionListener,HttpSessionAttributeListener{
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session");
}
@Override
public void attributeAdded(HttpSessionBindingEvent event) {
System.out.println("新增session值");
}
@Override
public void attributeRemoved(HttpSessionBindingEvent event) {
System.out.println("移除session值");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent event) {
System.out.println("替换session值");
}
}
Request:
@WebListener
public class MyRequestListener implements ServletRequestListener, ServletRequestAttributeListener {
public void requestDestroyed(ServletRequestEvent arg0) {
System.out.println("request销毁");
}
public void attributeRemoved(ServletRequestAttributeEvent arg0) {
System.out.println("移除request作用域里的值");
}
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("request初始化");
}
public void attributeAdded(ServletRequestAttributeEvent arg0) {
System.out.println("新增request作用域里的值");
}
public void attributeReplaced(ServletRequestAttributeEvent arg0) {
System.out.println("替换request作用域里的值");
}
}
三十一. 销毁Session的两种方式
- 手动:request.getSession().invalidate();
2.Web.xml里配置
1
三十二. 自定义标签(Tag文件)
- 新建一个tag文件
<%@ tag language=“java” pageEncoding=“utf-8”%>
<%@ attribute name=“action” required=“true”%>
<%@ attribute name=“subName” required=“true”%>
- 引用自定义标签
<%@ taglib tagdir="/WEB-INF/tags" prefix=“a” %>
<a:MyFirstTag subName=“注册” action="/MyServlet"></a:MyFirstTag>