JSP—El表达式,java脚本,java表达式,jstl标签库
Published on 2022-11-12 20:49 in 分类: JSP with 花海~
分类: JSP

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就失效了,一个会话就是一个浏览器,打开了另一个就无了

 

 

 

posted @   花海~  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示