jsp,mvc架构
概述
Java Server Pages:和servlet一样,用于动态web技术
Jsp原理
D:\apache-tomcat-9.0.29\work\Catalina\localhost\ROOT\org\apache\jsp下有index_jsp.java,其中代码HttpJspBase类是extends HttpServlet类。idea中使用tomcat会在idea中tomcat生产work目录
浏览器向服务器发送请求,不管访问什么资源,其实就是在访问Servlet.
Jsp本质就是Servlet
//初始化
public void _jspInit() {
}
//销毁
protected void _jspDestroy() {
}
@Override
public abstract void _jspService(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException;
-
判断请求
-
内置对象
final javax.servlet.jsp.PageContext pageContext;//页面上下文 final javax.servlet.ServletContext application;//application final javax.servlet.ServletConfig config;//config javax.servlet.jsp.JspWriter out = null;//out final java.lang.Object page = this;//当前页 request//请求 response//响应 session exception
-
输出页面前的代码
response.setContentType("text/html; charset=UTF-8"); pageContext = _jspxFactory.getPageContext(this, request, response, null, false, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); out = pageContext.getOut(); _jspx_out = out;
-
以上对象可以在jsp页面直接使用
-
如果是java代码,jsp转servlet就会原封不动转化,如果是html。就会用out.write()
基础语法
依赖
<dependencies>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- jstl表达式 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
jsp表达式
-
语法
<%= new Date()%> <%= 变量或表达式> <% %> 脚本片段 <%! %> jsp声明 <%----%> jsp注释 jsp注释不会在客户端显示,而html注释会
-
jsp脚本片段
<% int sum = 0; for (int i = 1; i <= 100; i++) { sum = sum + i; } out.println("<h1>sum=" + sum + "</h1>"); %>
-
jsp脚本片段再实现
<% int sum = 0; for (int i = 1; i <= 100; i++) { sum = sum + i; } out.println("<h1>sum=" + sum + "</h1>"); %>
-
jsp声明
会被编译到jsp生成的java类中,其它会被生成到_jspService中
<%--会被编译到jsp生成的java类中,其它会被生成到_jspService中--%> <%! static { System.out.println("loading servlet"); } private int globalVar = 0; public void test(){ System.out.println("进入方法test"); } %>
jsp指令
错误页面
-
web.xml配置
<error-page> <error-code>404</error-code> <location>/404.jsp</location> </error-page> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page>
-
jsp页面声明
<%@ page errorPage="404.jsp" %>
-
include拼接
<%--1.会将两个页面合二为一--%> <%@ include file="404.jsp"%> <h1>hello</h1> <%@ include file="500.jsp"%> <%--2.本质还是两个页面--%> <jsp:include page="404.jsp"/> <h1>hello</h1> <jsp:include page="500.jsp"/>>
总结:第一种写法时,拼接的两个页面都声明了同一个变量,页面就会500错误。第二中书写时就会报错。所以推荐第二种写法
内置对象
- PageContext 存东西
- Request 存东西
- Response
- Session 存东西
- Application[ServletContext] 存东西
- config[ServletConfig]
- out
- page
- exception
作用域
application>session>request>pageContext
<%
pageContext.setAttribute("name1", "1号",PageContext.SESSION_SCOPE);
//等价于
session.setAttribute("name1", "1号");
%>
jsp标签,jstl标签,el表达式
jsp标签
<%--1.请求转发:坑:jsp:forward里面不要写注释--%>
<%--jsp:param:在请求里放参数--%>
<jsp:forward page="/jsptag1.jsp">
<jsp:param name="name" value="sz"/>
</jsp:forward>
<%--javaBean--%>
<%--javaBean--%>
<jsp:useBean id="user" class="com.moral.entity.User" scope="page"/>
<jsp:setProperty name="user" property="name" value="jpy"/>
name:<jsp:getProperty name="user" property="name"/>
等价于:
User user=new User();
user.setName("jpy");
<%--2.取参--%>
<%--取参--%>
<%= request.getParameter("name")%>
${param.name}
resuqestScope和requst
- ${requestScope.name} 等价于 request.getAttribute("name")
- request.getParameter("name")等价于parm.name
jstl标签
弥补html标签的不足,有很多自定义标签,标签功能和java代码一样
- 核心标签 <c
- 格式化标签 <fmt
- sql标签 <sql
- xml标签 <x
- jstl函数 <fn
如果tomcat中没有jstl和standard包,也需要导入jstl和standard的jar包
<%--引入jstl核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
if
<form action="jstl.jsp" method="get"> <label> <input type="text" name="username" value="${param.username}"> </label> <input type="submit" value="登陆"> </form> <c:if test="${param.username=='admin'}" var="isAdmin"> <c:out value="欢迎你${param.username}"/> </c:if> <c:out value="${param.username}"/> <c:out value="${isAdmin}"/>
-
foreach
<% ArrayList<Integer> nums = new ArrayList<Integer>(); nums.add(1); nums.add(2); nums.add(3); request.setAttribute("nums", nums); %> <br> <c:forEach var="num" items="${nums}"> <c:out value="${num}"/><br> </c:forEach>
MVC概述
架构模式,模型(Model)、视图(View)、控制器(Controller),降低了视图与业务逻辑间的双向偶合
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
- 展示数据
- 提供连接发起Servlet请求(a,form ,img...)
Controller(Servlet)
-
接收客户请求:(request:请求参数,Session信息...)
-
交给业务层处理对应的代码
-
控制视图跳转
登陆----》接收登陆请求---》Controller处理请求(获取登陆参数)---》业务层处理(判断用户名和密码:事务)---》Dao层(查询用户名和密码是否正确)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY