JSP,EL表达式
java命令书写规则
声明java变量
<%
int num=100;
%>
声明运行表达式
<%
int num3 = num1 + num2 ;//数学运算
int num4 = num2>=num1?num2 :num1;//关系运算
boolean num5 = num2>=200 && num1>=100;//逻辑运算
%>
声明控制语句
<%
if(num2>=num1){
<h1>大于
%>
<%
}else{
<h1>小于
%>
<%
}
%>
for(int i=1;i<=5;i++){}
声明对象
<%
//创建一个Student类型对象
student stu = new Student(18, "zhangsan" );
%>
学员编号:<%=stu.getage()%><br/>
学员姓名:<%=stu.getname()%>
JSP文件内置对象
HttpServletRequest
<%
string userName = request.getParameter([ s: "userName");
string password =request.getParameter([s: "password");
%>
来访用户姓名:<%=userName%><br/>
来访用户密码:<%=password%>
HeepSession
存
<%
HttpSession session=request.getSession();
session.setAttribute( "key1" , 200);
%>
取
<%
HttpSession session=request.getSession();
Integer value=(Integer) session.getAttribute(s:"key1 ");
%>
ServletContext 全局作用域对象
同一个网站中Servlet与JSP,都可以通过当前网站的全局作用域对象实现数据共享JSP文件内置对象:application
<%
ServletContext application = request.getServletContext();
application.setAttribute([ "key","hello world");
%>
Servlet 与JSP文件分工
- servlet:负责处理业务并得到处理结果
- JSP:不负责业务处理,主要任务将Servlet中【处理结果】写入到响应体
Servlet与JSP之间调用关系
servlet工作完毕后,一般通过请求转发方式向Tomcat申请调用JSP
Servlet 与JSP之间实现数据共享
- servlet将处理结果添加到请求作用域对象
- JSP文件在运行时从请求作用域对象得到处理结果
Http服务器调用JSP文件步骤
- 1.Http服务器将JSP文件内容【编辑】为一个servlet接口实现类(.java)
- 2.Http服务器将servlet接口实现类【编译】为class文件(.class)
- 3.Http服务器负责创建这个class的实例对象,这个实例对象就是servlet实例对象
- 4.Http服务器通过servlet实例对象调用jspservice方法,将jsp文件内容写入到响应体
EL表达式
命令格式
${作用域对象别名.共享数据}
命令作用:
- 1)EL表达式是工具包提供一种特殊命令格式【表达式命令格式】
- 2)EL表达式在JSP文件上使用
- 3)负责在JSP文件上从作用域对象读取指定的共享数据并输出到响应体
EL表达式—作用域对象别名
JSP文件可以使用的作用域对象
-
servletcontext
application: 全局作用域对象 -
Httpsession
session: 会话作用域对象 -
HttpservletRequest
request: 请求作用域对象 -
Pagecontext
pageContext:当前页作用域对象
这是JSP文件独有的作用域对象。servlet中不存在
在当前页作用域对象存放的共享数据仅能在当前JSP文件中使用,不能共享给其他servlet或则其他JSP文件
真实开发过程,主要用于JST标签与JSP文件之间数据共享 数据 JSTL------->pagecontext---->JSP
EL表达式提供作用域对象别名
- application
${ applicationScope.共享数据名} - session
${sessionScope.共享数据名} - request
${requestScope.共享数据名} - pagecontext
$ {pageScope.共享数据名}
EL表达式将引用对象属性写入到响应体
命令格式
${作用域对象别名.共享数据名.属性名}
命令作用
从作用域对象读取指定共享数据关联的引用对象的属性值。并自动将属性的结果写入到响应体
属性名
一定要去引用类型属性名完全一致(大小写)
EL表达式没有提供遍历集合方法,因此无法从作用域对象读取集和内容输出
public class 0neservlet extends HttpServlet {
protected void doGet(HttpServletRequest request,HttpServleresponse) throws ServletException,IOException {
Student stu = new Student( 20, "zhangsan");
//2.将引用类型对象存入到请求作用域对象作为共享数据
request.setAttribute( "key" , stu);
//3.请求转发,向Tomcat申请调用index_1.jsp
request.getRequestDispatcher("/1ndex_1.JSP").forward(request,response);
}
}
学员编号:S{requestScdpe.key.age}<br/>
学员姓名:S{requestscope.key.name}
EL表达式简化版
命令格式
${共享数据名}
命令作用
表达式允许开发人员开发时省略作用域对象别名
工作原理:
表达式简化版由于没有指定作用域对象,所以在执行时采用【猜】算法
- 首先到【pagecontext】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【pagecontext】没有定位成功,到【request】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【request】没有定位成功,到【session】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【session】没有定位成功,到【application】定位共享数据,如果存在直接读取输出并结束执行
- 如果在【application】没有定位成功,返回null
pagecontext—>request—>sessionl—>application
存在隐患:
容易降低程序执行速度【南辕北辙】|容易导致数据定位错误
应用场景:
设计目的,就是简化从pagecontext读取共享数据并输出难度
EL运算支持运算表达式
<%
int num1=1;
int num2=2;
%>
${num1+num2}
关系运算
<!--传统Java命令方式实现关系运算输出-->
<%
if((age)>=18){
%>
欢迎光临<br/>
<%
}else{
谢绝入内<br/>
<%
}
%>
EL表达式:
${age>=18?允许:拒绝}
EL表达式提供内置对象
param
命令格式
${param.请求参数名}
命令作用
从通过请求对象读取当前请求包中请求参数内容
并将请求参数内容写入到响应体
http://localhost:8080/myWeb/index_1.jsp?userName=mike&password=123
来访者姓名:S{param.userName}<br/>
来访者密码:${param.password}
paramvalues
命令格式
${paramvalues.请求参数名[下都]}
命令作用
如果浏览器发送的请求参数是一个请求参数关联多个值此时可以通过paramvaues读取请求参数下指定位置的值并写入到响应体
<!--
http://localhost:8080/myWeb/index_2.jsp?habbit=a&habbit=b&habbit=c-->
${paramValues.habbit[0]}<br/>
$iparamValues.habbit[1]}<bi/>
S{paramValues.habbit[2]}<br/>
EL表达式常见异常:
javax.e1.PropertyNotFoundException:在对象中没有找到指定属性