石一歌的JavaWeb笔记
转发和重定向
- 转发时"/"代表的是本应用程序的根目录
- 重定向时"/"代表的是webapps目录
//重定向
//resp.sendRedirect("/request_war/success.jsp");
//容器转发(使用少)
//this.getServletContext().getRequestDispatcher("/success.jsp").forward(req,resp);
//请求转发
//req.getRequestDispatcher("/success.jsp").forward(req, resp);
Jsp内置对象和作用域
九大对象
- PageContent 可存值
- Requst 可存值
- Response
- Session 可存值
- Application(ServletContext) 可存值
- Config (ServletConfig)
- out
- page
- exception
四大作用域
pageContext.setAttribute("name1", "1");
当前页面有效
request.setAttribute("name2", "2");
转发有效,重定向失效
session.setAttribute("name3", "3");
关闭浏览器前有效
application.setAttribute("name4", "4");
服务器共享
可通过setAttribute的第三个参数设置Attribute的作用域
拓展-双亲委派机制
jsp语法
jsp语法
-
jsp表达式
-
程序输出到客户端
<%= new java.util.Date() %>
-
jsp脚本片段
<% int sum=0; for (int i=0; i < 100; i++) { sum +=i; } System.out.println(sum); out.println("<h1>Sum" + sum + "</h1>"); %>
-
jsp声明
会被编译到jsp生成的java类中,其他会被放置到jspservlet方法<%! static { System.out .println("loading!!!"); } private int globalVar=0; public void han() { System.out.println("进入函数"); } %>
-
注释
<%-- Jsp注释在客户端会被直接删除,安全性高--%> <!-- HTML注释会被保存下来-->
-
扩展el表达式
Jsp指令
-
配置错误页面
- 直接指向错误页
<%@ page errorPage="error/500.jsp" %>
2.web.xml配置错误页
<error-page> <error-code>404</error-code> <location>/error/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/error/500.jsp</location> </error-page>
-
提取公共页面
- <%@include file=“”%>将页面组合起来
<%@include file="common/header.jsp" %> <h1>主题</h1> <%@include file="common/footer.jsp" %>
2. <-jsp:include page=“”->拼接页面,还是三个页面,常用(变量互不影响)
<jsp:include page="/common/header.jsp"/> <h1>主题</h1> <jsp:include page="/common/footer.jsp"/>
Jsp标签&JSTL标签&EL表达式
EL表达式:$
- 获取数据
- 执行运算
- 获取web开发常用对象
Jsp标签
<jsp:include page="Jsp02.jsp"></jsp:include>
<%--包含--%>
<jsp:forward page="/Jsptag02.jsp">
<%--转发--%>
<jsp:param name="value1" value="1"/>
<%--传参--%>
<jsp:param name="value2" value="2"/>
</jsp:forward>
JSTL标签
为了弥补html标签的不足,jstl标签库
核心标签
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
引用核心标签库的语法
<form action="coreif.jsp" method="get">
<input type="text" name="username" value="${param.username}">
<input type="submit" value="login">
</form>
<%--<%--%>
<%-- if (request.getParameter("username").equals("admin"))--%>
<%-- out.println("登陆成功");--%>
<%--%>--%>
<c:if test="${param.username=='admin'}" var="isAdmin" scope="request">
<c:out value="管理员欢迎您"></c:out>
</c:if>
<c:out value="${isAdmin}"></c:out>
<c:set var="score" value="100"></c:set>
<c:choose>
<c:when test="${score>=90}">
优秀
</c:when>
<c:when test="${score<60}">
不及格
</c:when>
</c:choose>
<%--var是每次变量--%>
<%--items是被遍历的对象--%>
<%--begin是起点--%>
<%--end是终点--%>
<%--step是步长--%>
<%--遍历常用--%>
<c:forEach begin="1" end="2" step="1" var="people" items="${list}">
<c:out value="${people}"></c:out>
<br>
</c:forEach>
过滤器
过滤网站数据
- 处理中文乱码
- 登陆验证
开发步骤
-
导包
-
编写过滤器
实现Filter接口,重写方法
@Override
//初始化
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化完成");
}
@Override
// chain:链
// 过滤中所有代码,在特定请求时执行
// 必须要过滤器执行
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("正在过滤");
filterChain.doFilter(servletRequest, servletResponse);//请求继续执行
System.out.println("过滤完成");
}
@Override
// 销毁
public void destroy() {
System.out.println("过滤器已销毁");
}
- web.xml配置过滤器
监听器
实现一个监听器
-
编写监听器
实现接口
//统计网站在线人数(session) public class OnlineCountListener implements HttpSessionListener { @Override // 创建session监听 public void sessionCreated(HttpSessionEvent se) { //获取session并提权 ServletContext ctx = se.getSession().getServletContext(); System.out.println(se.getSession().getId()); // 获取session值 Integer onlinecount = (Integer) ctx.getAttribute("OnlineCount"); //处理加一 if (onlinecount == null) onlinecount = new Integer(1); else { int count = onlinecount.intValue(); onlinecount = new Integer(count + 1); } ctx.setAttribute("OnlineCount", onlinecount); } @Override // 销毁session监听 public void sessionDestroyed(HttpSessionEvent se) { //获取session并提权 ServletContext ctx = se.getSession().getServletContext(); se.getSession().invalidate(); // 获取session值 Integer onlinecount = (Integer) ctx.getAttribute("OnlineCount"); //处理减一 if (onlinecount == null) onlinecount = new Integer(0); else { int count = onlinecount.intValue(); onlinecount = new Integer(count - 1); } ctx.setAttribute("OnlineCount", onlinecount); } }
- 注册监听器
<listener> <listener-class>com.nuc.listener.OnlineCountListener</listener-class> </listener>
JavaBean
- 必须无参构造
- 属性必须私有化
- 必须要有get/set方法
一般用来和数据库字段做映射 ORM
ORM 对象关系映射
表->类
字段->属性
行记录->对象
Jabc事务
事务
ACID原则
开启事务 start transaction
事务提交 commit()
事务回滚 rollback()
关闭事务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!