服务器之--JSP

本文深入讲解JSP技术,包括其概念、运行原理、执行过程、基础语法、指令及动作标签等核心内容,并介绍了如何利用EL表达式简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.jsp是什么
jsp是服务器动态的web开发技术,可以理解为:ISP=HTML+Servlet

2.jsp运行原理
WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

3,jsp的执行过程
客服端发出请求,web容器(Servlet引擎)将jsp转译成Servlet源代码,Servlet引擎将产生的源代码进行编译,Servlet引擎加载编译后的代码并执行,把执行结果响应到客户端
流程图
这里写图片描述
4.jsp的基础语法
小脚本<% Java代码 %>
表达式<%= 显示数据的 ,也可以进行运算,相当于out.print(). %>

<%

     int num2 = 10;
    num1++;
    num2++;
    //out.print(num1);
    %>

    <!-- 输出到网页上 -->
    <%--相当于out.print(num1) --%>
    <%=num1 %>
    <%=num2 %>

HTML注释:
<%! 可以声明成员变量 和 方法%>

<%!
   //代码会被编译到 类中方法外
   int num1=10;
   public void fun(){

   }
   %>

4.1java中的三个指令
1.page指令
<%@page %>

   <!-- 相当于Session开关 默认开启状态 
    Session等于false是,在小脚本中不能世界调用Session对象
-->
 <%@page session="false" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- pageEncoding设置本页面的编码格式
         contentType 相当于response.setContextType();
     -->

设置错误页面

  <!-- errorPage可以设置错误页面 -->
 <%@page errorPage="/3.jsp" %>

获取异常信息

<!-- 默认是关闭的,开启后可以使用exception对象来获取异常信息 -->
 <%@page isErrorPage="true" %>

Include 包含

5.jsp的6个动作

静态包含
编译时,会把两个页面合在一起编译成一个.Java文件,输出2个HTML标签
5.jsp没出现.Java和.class文件 而是和4.jsp何在一起了

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 静态包含 
            编译成.Java文件时直接把两个界面合一起编译了一个.Java文件
            输出了两套HTML标签
    -->
     <%@include file="/5.jsp" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
吾问无为谓无无无无
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
            嘎嘎的嘎嘎发的个个都是
</body>
</html>

输入结果为
这里写图片描述
动态包含
当读到动态包含时,才会把动态的那个页面,编译成.Java文件
和4.jsp一样创建了.Java和.class文件

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

    <!-- 动态包含 
            当读取到动态包含时 才会把动态包含的那个页面 编译成.Java文件
    -->
    <<jsp:include page="/5.jsp"></jsp:include>  

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
吾问无为谓无无无无
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
            嘎嘎的嘎嘎发的个个都是
</body>
</html>

运行结果
和静态包含一样
总结:

两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

原则:能用静的就不用动的。

taglib标签库

<!-- 
    引入jstl标准标签库
    prefix 使用标签时 起的别名
-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

5.1 jsp的动作标签
jsp:forWord请求转发
jsp:prarm请求其中的参数
jsp:forWord标签要包含jsp:prarm标签

 <jsp:forward page="/7.jsp">
        <jsp:param value="wanglong" name="username"/>
        <jsp:param value="123" name="password"/>
     </jsp:forward> 

获取参数
用的方法request.getParameter();

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- 获取参数 -->
    <%=request.getParameter("username") %>
    <%=request.getParameter("password") %>
</body>
</html>

5.2
jsp:userBean创建一个对象
jsp:setProperty给指定的对象属性赋值
jsp:getProperty取出指定对象属性值
首先我先创建一个User对象.这里就不写出了

<%@page import="com.lanou3g.User"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!--  -->
    <%
      User user = new User();
     user.setUsername("王龙");
     user.setPassword("123");
    %>
    <%=user.getUsername() %>
    <!-- 使用userBean标签创建一个对象 
         id:表示创建这个对象的名字
         class:表示使用哪个类创建该对象
    -->

    <jsp:useBean id="user1" class="com.lanou3g.User"></jsp:useBean>
    <!-- 
        name:赋值是哪个对象
        property:属性名
     -->
    <jsp:setProperty property="username" name="user1" value="kuner"/>
    <jsp:setProperty property="password" name="user1" value="123"/>
    <!-- 获取对象 -->
    <jsp:getProperty property="username" name="user1"/>
</body>
</html>

6.jsp的内置对象
6.1pageContext域对象
作用范围:只有当前页面访问到,不过pageContext有个非常强大的地方,就是可以操作所有的域对象

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
    //配置pageContext 域对象 作用返回:只能当前页面访问到
    //pageContext强大之处 可以获取(操作)所有的域对象
        pageContext.setAttribute("sex", "女");
    %>
    <%=
        pageContext.getAttribute("sex")
    %>
</body>
</html>

6.2利用pageContext进行全局查找

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!--  -->
    <%
        //利用pagecontext对象 往各个域中存值
        //参数3表示 向哪个域存值 参数1表示名字  参数2表示添加的值
        pageContext.setAttribute("www", "pageContext", PageContext.PAGE_SCOPE);
        //相当于request.setAttribute("www","request");
        pageContext.setAttribute("www", "request", PageContext.REQUEST_SCOPE);

        pageContext.setAttribute("www", "session", PageContext.SESSION_SCOPE);

        pageContext.setAttribute("www", "ServlectContext", PageContext.APPLICATION_SCOPE);
    %>
    <!-- 进行全域查找 从域的小 到 大-->
    <%=pageContext.findAttribute("www") %>
</body>
</html>

7.EL表达式
7.1
EL表达式(一种书写规范)是全域查找的简便写法,还提供了Java代码在jsp页面的简便书写方式
查询到结果就输出到页面上,如果在域中没有找到值就什么都不显示(pageContext.findAttribute()查找到不到是就会显示为null)
EL在全域查找时调用了findAttribute()方法

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!--  -->
    <%
        //利用pagecontext对象 往各个域中存值
        //参数3表示 向哪个域存值 参数1表示名字  参数2表示添加的值
        pageContext.setAttribute("www", "pageContext", PageContext.PAGE_SCOPE);
        //相当于request.setAttribute("www","request");
        pageContext.setAttribute("www", "request", PageContext.REQUEST_SCOPE);

        pageContext.setAttribute("www", "session", PageContext.SESSION_SCOPE);

        pageContext.setAttribute("www", "ServlectContext", PageContext.APPLICATION_SCOPE);
    %>
    <!-- 全域查找的简便写法
        EL表达式 一个书写规范
        提供了Java代码在jsp页面的简便书写方式
         ${www }表示全域查找name="www"的值 并且输出到网页上
         内部就是调用了findAttribute("www")方法 从小到大
         当 没有从域中查找到值的时候什么都不显示
     -->
     ${www}
</body>
</html>

7.2EL表达式对于空值的判断 返回值为Boolean值

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- El表达式对空值的判断 -->
    <%
        String string1 = null;
        request.setAttribute("str1", string1);
        String string2 = "";
        request.setAttribute("str2", string2);
        String string3 = "王龙";
        request.setAttribute("str3",string3 );

        ArrayList<String> list1 = new ArrayList<>();
        request.setAttribute("list1", list1);
        ArrayList<String> list2 = new ArrayList<>();
        list2.add("123");
        list2.add("456");
        request.setAttribute("list2", list2);
        %>
    <!-- 测试EL表达式对空值的显示效果 
        不管定义的是空 还是没有内容 都不会报错
        换句话说 有值才会显示(容错性好)
    -->
    ${str1}
    ${str2}
    ${str3}
    ${list1}
    ${list2}
    <!-- 判断空值的方法 关键词empty 结果返回true 或者 false-->
    ${empty str1}
    ${empty str2}
    ${empty str3}
    ${empty list1}
    ${empty list2}

7.3利用El 测试三目运算

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

    <%
        S
        //测试三目
        //根据从域中取出来的值 来让单选框 默认选择哪个
        String nv = "女";
        request.setAttribute("name", nv);
    %>

    <!-- 支持三目表达式 -->
    ${empty str2 ? name:"我是后面的" }
    <!-- 根据域中的值 选中男女 --><input type="radio" name="sex" value="男" ${name=="男" ? "checked='checked'":""}><br>
    女<input type="radio" name="sex" value="女" ${name=="女" ? "checked='checked'":""}>
</body>
</html>

7.4EL表达式获取对象的属性值

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- El表达式 获取对象的属性值 
        JavaBean导航(对象导航) 
        //struts2 spring hibernate 
    -->
    <%
        City city = new City();
        city.setAddress("上海");
        User user = new User();
        user.setUsername("王龙");
        user.setPassword("123");
        user.setCity(city);
        request.setAttribute("u1", user);   
    %>
    <!-- 内部相当于调用 getUsername()方法 
        用点能获取的 用[]都能获取 用[]获取的 用点获取不了
    -->
    ${u1.username}
    ${u1['username']}
    ${u1["username"]}
</body>
</html>

7.5利用EL表达式的隐式对象
隐式对象是指:JSP的隐式对象是指在JSP页面系统中已经默认内置的Java对象

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <!-- EL表达式的隐式对象 
        注意:隐式对象 在EL表达式中书写
    -->
    <%
        //利用pageContext对象保存值
        pageContext.setAttribute("xxx", "pageContext", PageContext.PAGE_SCOPE);
        pageContext.setAttribute("xxx", "request", PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("xxx", "session", PageContext.SESSION_SCOPE);
        pageContext.setAttribute("xxx", "application", PageContext.APPLICATION_SCOPE);
    %>
    <!-- 可以指定隐式对象 指定域查找对应的值 -->
    ${requestScope.xxx }
    ${sessionScope.xxx }
    ${applicationScope.xxx }
    ${pageScope.xxx }
</body>
</html>

7.6利用EL表达式获取表单中的参数
创建表单代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/13.jsp" method="post">
        姓名:<input type="text" name="username"><br>
        密码:<input type="text" name="password"><br>
        跳舞:<input type="checkbox" name="hobby" value="跳舞">
        唱歌:<input type="checkbox" name="hobby" value="唱歌"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

获取表单参数
${prarm.username}相当于request.getParamemter(“username”)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        //解决响应乱码
        response.setContentType("text/html;charset=UTF-8");
        //解决请求乱码
        request.setCharacterEncoding("UTF-8");
    %>
    <!-- 获取表单提交的数据 
    param ${param.userName } request.getParamemter("userName");
    -->
    ${param.username}
    ${param.password}
    ${paramValues.hobby[0]}
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值