jsp之EL表达式
1、EL表达式
EL 全名为Expression Language,翻译成中文表达式语言
语法:${标识符}
作用就是输出标识符的所代表的值。
el出现目的:代替<%= %>,代替out.print();
常用功能:
获取各种域(各种数据范围,servletContext(全局的),request(一次请求)中存储的数据
request.setAttribute(“name” ,value);
${ requestScope.name}
<%=request.getAttribute(“name”);>等价于 ${requestScope.name}从request这个对象中去取出数据。
优点:如果el表达式没有取到值,不会显示,可以理解为输出空的字符串
而request/context .getAttribute() 如果取不到值,得不到的是null,会输出null
过程图及servlet生命周期
servlet生命周期:
1.容器会创建servlet的实例,调用init方法进行初始化 ;
2.容器调用service方法接收请求,判断是get请求还是post请求,如果是get请求,转发到doGet方法,如果post请求,转发到doPost方法;
3.调用doGet doPost方法处理请求;
4.响应给客户端浏览器;
5.如果服务关闭,会调用destroy方法销毁servet实例;
init senvice destroy这三个方法,称为生命周期方法;
init和destroy只执行一次,service可以执行多次;
el作用:
EL主要作用:
1、获取数据:最常用的是从4个域对象获取数据 (page,request,session,application(servletContext))。
EL表达式主要用于替换JSP页面中的脚本表达式<%= %>,以从各种类型的web域中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
主要替换<%= %>
2、执行运算:
利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
3、获取web开发常用对象
EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
4、调用Java方法
EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
2、配置servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置servlet-->
<servlet>
<servlet-name>UserServlet</servlet-name>
<servlet-class>com.hisoft.web.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/user.do</url-pattern>
</servlet-mapping>
</web-app>
3、servlet 继承HttpServlet(重写的方法)
public class UserServlet extends HttpServlet {
/**
* 接收客户端请求,判断是get请求还是post请求,如果是get请求,则转发到doGet()方法,如果是post请求,转发到doPost()方法
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
System.out.println("service........");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
@Override
public void init() throws ServletException {
super.init();
System.out.println("init...");
}
/*关闭*/
@Override
public void destroy() {
super.destroy();
System.out.println("destory.......");
}
}
4、简单登录例子
servlet内容
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取表单name属性值为username的value值
String username = request.getParameter("username");
//获取表单name属性值为password的value值
String password = request.getParameter("password");
UserService userService = new UserService();
User user = null;
try {
user = userService.login(username, password);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//登录成功与否
if(user != null){
request.setAttribute("user",username);
request.getRequestDispatcher("success.jsp").forward(request,response);//成功界面
}else{
request.getRequestDispatcher("index.jsp").forward(request,response);//返回主页面
}
}
jsp内容
登录:
<form action="user.do" method="post">
用户名:
<input type="text" name="username"/><br>
密码:
<input type="password" name="password"/><br>
<input type="submit" value="登录"/>
</form>
5、el获取数据–从各个域对象中
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。
替代掉<%= %>
(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
如果数据是null,把null输出给用户,用户不会理解null是什么意思。所以使用el表达式输出的空字符。
域对象是可以省略的。省略的时候,会自动从page,request,session,application去查询数据。
<%
pageContext.setAttribute("name","张三",pageContext.REQUEST_SCOPE);
pageContext.setAttribute("name","page");
request.setAttribute("name","request");
session.setAttribute("name","session");
application.setAttribute("name","application");
%>
page name:${pageScope.name}<br>
request name:${requestScope.name}<br>
session name:${sessionScope.name}<br>
application name:${applicationScope.name}<br>
省略隐含对象:${name}<br> (按从小到大范围获取)
6、简单运算
算数运算:${1+1}<br>
关系运算1>2:${1 gt 2}<br>
关系运算1>=2:${1 ge 2}<br>
关系运算1<2:${1 lt 2}<br>
关系运算1<=2:${1 le 2}<br>
5!=5:${5 ne 5}; //false
逻辑运算1==2||2==2:${1 eq 2 and 2 eq 2}<br>
逻辑运算1==2&&2==2:${1 eq 2 or 2 eq 2}<br>
非空判断:${not empty user}<br>
空值判断:${empty list}<br>
//(空字符串,空的集合也是空的)
7、获取复杂数据
数组、list集合、map集合
<%
int[] ages = {21,20,18,16,24};
request.setAttribute("ages",ages);
List list = new ArrayList<>();
list.add("hello world");
list.add("java");
list.add("mysql");
list.add("jsp");
request.setAttribute("list",list);
Map<String,Integer> map = new HashMap<>();
map.put("Rose",12);
map.put("Alex",18);
map.put("jerry",20);
map.put("Tom",21);
map.put("1",12345);
request.setAttribute("map",map);
%>
ages:${ages[0]},${ages[1]},${ages[2]},${ages[3]};
list:${list[0]}
map:${map};
map的Rose:${map.Rose};
map的1:${map["1"]};
el的中括号与点的区别
如果属性或者key出现了特殊字符。使用对象.属性名的时候,就会找不到数据。可以使用 [ ]进行替代;
把属性或者key放到中括号中加上双引号引起来,可以取出数据。
map的Rose:${map.Rose}; //获取Rose对应的值
map的1:${map["1"]}; //获取1对应的值
el常用web对象使用–(隐含对象)
获取web开发常用对象 记忆的时候,记住四个域对象。
EL表达式语言中定义了11个隐含对象,我们可以直接使用这些对象。被el预定好了,可以直接使用,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据。
param:
pageContext:${pageContext};
page:${pageContext.request.contextPath}; //上级路径
username:${param.username}
password:${param.password}
pageContext:org.apache.jasper.runtime.PageContextImpl@45ade79e;
page:/jsp01_war_exploded;
headers:${header.host}<br>
cookie:${cookie.JSESSIONID}<br>
initParam:${initParam.name}<br>
web.xml初始化:
<!--初始化-->
<context-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</context-param>
headers:localhost:8080
cookie:javax.servlet.http.Cookie@14a982c
initParam:张三