JSP—El表达式,java脚本,java表达式,jstl标签库
jsp简介
JSP(全称Java Server Pages)是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
JSP 技术是以 Java 语言作为脚本语言的,JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于HTTP的应用程序。
JSP文件后缀名为 *.jsp 。
JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows 上。
像原先没有jsp之前,写html的话就是如下图这样,一行行输出,很麻烦,所以出现了jsp

jsp一些问题:
1.jsp是什么?
javaServer pages,基于java语言实现的服务端页面,jsp就是javaEE规范之一
2.jsp文件通常放在什么位置?
jsp可以放在web-inf目录外,目前是这样的,
在实际开发中很多项目jsp放在web-inf中,保护jsp,web-inf相对是安全的
3.jsp后缀是什么?
默认.jsp,但是.jsp文件也是可以修改的,通过web.xml文件来修改
4.js和jsp的区别?
js:javaScript,运行在浏览器,和服务器没关系,和java也咩关系
jsp:javaserver pages,运行在服务器上,jsp默认底层就是Java程序,运行在·jvm中
5.jsp的执行原理?
在浏览器上访问的路径默认就是.jsp结尾的,访问的是某个文件,其实底层执行的是和jsp相对应的servlet
Tomcat服务器负责将.jsp文件翻译生成.java源文件,并且将java源文件编译成.class文件
访问.jsp文件就是访问了.class文件的程序
Tomcat服务器内置了一个jsp翻译引擎,专门负责生成jsp文件编译源文件
jsp就是servlet,只不过职责不同,jsp强项是页面展示
6.在jsp文件中编写的所有的html、css、javascript、对于jsp来说,只要是普通的字符串,被翻译到out.write("翻译的内容")
7.jsp文件修改之后,不需要在部署,也不需要重启动Tomcat服务器
8.jsp也是单例多线程环境下运行下的一个servlet对象
9.jsp文件在什么时候会被重新翻译?
jsp文件被修改之后会被重新翻译
怎么确定jsp文件被修改了呢?Tomcat服务器会记录jsp文件的最后修改时间
JSP脚本元素
使用JSP脚本元素可以将Java代码嵌入到JSP页面里,这些Java代码将出现在由当前JSP页面生成的Servlet中,使JSP将静态内容与动态内容分离出来。脚本元素包含:
1. 表达式
表达式: 是对数据的表示,系统将其作为一个值进行计算。
语法:<%= expression %>
例如:<%= user.getName()%>
表达式的本质:在将JSP页面转换成Servlet后,使用out.print()将表达式的值输出。这样如果user.getName()的返回值是"liky", 那么实际上在servlet中就将转换成out.print("liky");
因此这里要注意以下两点:
1) 如果表达式是调用一个方法,那么这个方法必须要有返回值,而不应是void,也就是说void getName()这样的方法是不能被调用的。
2) 在方法的后面不能有分号;例如<%=getName();%>这是不允许的。
例如:
2. 脚本
脚本:就是在<% %>里嵌入Java代码,这里的Java代码和我们一般的Java代码没有什么区别,所以每一条语句同样要以";"结束,这和表达式是不相同的
语法:<% code %>
脚本的本质:就是将代码插入到Servlet的service方法中。
例如:
<% if (user != null ) { %> Hello <B><%=user%></B> <% } else { %> You haven't login! <% } %> 转译成: if (user != null ) { out.println("Hello <B>" + user + "</B>"); } else { out.println("You haven't login!"); }
3. 声明
声明:就是允许用户定义Servlet中的变量、方法
语法:<%! code %> 例如:<! String getName() {return name;}>
声明的本质:其实就是将声明的变量加入到Servlet类(在任何方法之外),方法就成了Servlet的方法。
第一个jsp程序
<title>第一个jsp程序</title> </head> <body> <% response.getWriter().write("hello word"); %> </body>
如下图可以输出

案例:JDBC连接数据库jsp页面显示
1.JDBC工具类
package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import com.mysql.jdbc.Driver; public class JdbcUtils { private JdbcUtils() {} static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Connection getConnection() throws SQLException{ return DriverManager.getConnection("jdbc:mysql://localhost:3306/djm","root","123456"); } public static void close (Connection conn,PreparedStatement ps,ResultSet rs){ if(rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(ps!=null) { try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
2.dao层查询数据
public class UserDao { //查询全部员工 public List<User> getallUser(){ Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; try { conn=JdbcUtils.getConnection(); ps = conn.prepareStatement("select * from user"); rs = ps.executeQuery(); List<User> list=new ArrayList<User>(); while(rs.next()) { String username = rs.getString("username"); int userno = rs.getInt("userno"); String job = rs.getString("job"); String password = rs.getString("password"); BigDecimal sal = rs.getBigDecimal("sal"); User user = new User(username,userno,job,password,sal); list.add(user); } return list; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); throw new RuntimeException(e); }finally { JdbcUtils.close(conn, ps, rs); } } }
3.s1这个servelet调用,转发到jsp页面显示
@WebServlet("/s1") public class s1 extends HttpServlet{ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub UserDao dao = new UserDao(); List<User> getallUser = dao.getallUser(); //通过转发将数据转发给jsp request.setAttribute("amount",getallUser.size()); request.setAttribute("getallUser",getallUser); //转发 request.getRequestDispatcher("/x.jsp").forward(request,response); System.out.println(); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } }
4.jsp页面(el表达式取值范围:先在pagecontext,然后request,然后session,最后application就是ServletContext)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.List,pojo.User"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <!-- jsp显示数据的三种方式 1.el表达式 从三大内置对象中取值 2.java表达式 3.java脚本 4.jstl标签库 --> <body> <!-- //el表达式 --> 共查询到${amount}个人<br> ${getallUser}<br> <!-- 或者 java表达式--> <%=request.getAttribute("amount")%><br> <!-- 或者 --> <% int amount=(int)request.getAttribute("amount"); List<User> getallUser=(List<User>)request.getAttribute("getallUser"); %> <%=amount %><br> 员工列表 <table border="1"> <tr> <th>username</th> <th>job</th> </tr> <% for(int i=0;i<getallUser.size();i++){ User user=getallUser.get(i); %> <tr> <td><%=user.getUserame() %></td> <td><%=user.getJob() %></td> </tr> <% } %> </table> </body> </html>
运行s1结果如下
首先el表达式查询出的人数或者java表达式和java脚本输出

jstl查询,需要导入四个jar包
注意还要在头部加入包别忘了(
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
)
//在以上jsp页面代码基础上加上这个 员工列表 <table border="1"> <tr> <th>username</th> <th>job</th> </tr> <c:forEach items="${getallUser}" var="user"> <tr> <td><c:out value="${user.username}"/></td> <td><c:out value="${user.job}"/></td> </tr> </c:forEach> </table>
<%--if标签:条件判断,类似java里面的if语句 test表示条件,返回布尔类型的值,值为true的时候,显示if标签内容,值为false就不显示if标签内容 test里面的表达式通常配合EL表达式使用 --%> <c:if test="${10 > 5}"> 这是需要显示的if条件内容! </c:if> <%--forEach集合遍历标签:遍历集合对象的标签 items遍历的目标集合对象 var集合对象中的元素 step遍历集合的步长 begin遍历的开始位置 end遍历的结束位置 varStatus 元素位置状态:index 集合中元素索引 count 集合中元素的位置 --%>
查询结果一样

以下freach等价于for循环,<c:out等价于<%=%>

jsp四大作用域和九大内置对象(九大内置对象包括了四大作用域)以下列出几个
1.page
<% //page对象 System.out.println(page); %>
控制台会输出
2.requet
<% //request String name=request.getParameter("name"); System.out.println(name); request.getRequestDispatcher("/show2.jsp").forward(request,response); %>
在show2.jsp中写显示show2.jsp,如下图运行就支持转发,并且在控制台输出Y

3.response
<% //response response.getWriter().write("666"); %>
会输出666

4.application
<% //application String msg=application.getInitParameter("msg"); System.out.println(msg); %>
在web.xml中配置
<context-param> <param-name>msg</param-name> <param-value>from context</param-value> </context-param>
会输出

5.exception,在头部加上一个errorPage="error.jsp",如果异常跳转到error.jsp页面(其他代码省略了)
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" errorPage="error.jsp"%> <% //exception int a=1/0; %>
error.jsp如下
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Insert title here</title> </head> <body> 亲,操作过于频繁,请重新尝试 </body> </html>
然后运行就会跳转到error.jsp

输出异常信息的话在error.jsp头部加上“ isErrorPage=“true” ”
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" isErrorPage="true"%>
然后可以打印输出,注意:jsp不能抛出异常
亲,操作过于频繁,请重新尝试 <% System.out.println(exception); %>
测试servlet发出信息,jsp接收
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub request.setAttribute("msg","请求"); request.getRequestDispatcher("/show.jsp").forward(request,response); } jsp中: <%=request.getAttribute("msg")%>
输出信息

如果是这样
request.setAttribute("msg","请求"); HttpSession session = request.getSession(); session.setAttribute("msg","请求2"); ServletContext context = request.getServletContext(); context.setAttribute("msg","请求3"); request.getRequestDispatcher("/show.jsp").forward(request,response);
<%=request.getAttribute("msg") %><br> <%=session.getAttribute("msg") %><br> <%=application.getAttribute("msg") %><br>
运行s2这个servlet是这样

直接运行jsp就是这样了,request就失效了

如果在换到浏览器中又是这样了,session就失效了,一个会话就是一个浏览器,打开了另一个就无了

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术