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>