一、 jsp的最佳实践
Servlet技术: 开发动态资源。是一个java类,最擅长写java代码
jsp技术: 开发动态资源。通过java代码最擅长输出html代码。
各取所长:
在web项目中涉及到逻辑:
1)接收参数 servlet做
2)处理业务逻辑,返回结果 servlet做
3)显示数据到浏览器 jsp做
4)跳转到其他页面 servlet做
servlet+jsp模式
servlet:
1)接收参数
2)处理业务逻辑
3)把结果保存到域对象中
4)跳转到jsp页面
Jsp:
1)从域对象取出数据
2)把数据显示到浏览器
servlet的数据 -> jsp页面
List<Contact> 使用域对象 共享数据
jsp的最佳实践
jsp的最佳实践:servlet+jsp模式
jsp的核心语法: jsp表达式 <%=表达式 %>和 jsp脚本<% %>。
以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
二、EL表达式
2.1 EL表达式的作用
jsp的核心语法: jsp表达式 <%=表达式 %>和 jsp脚本<% %>。
以后开发jsp的原则: 尽量在jsp页面中少写甚至不写java代码。
使用EL表达式替换掉jsp表达式。
EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果!!!
语法: ${变量或表达式}
使用EL表达式,不需要导包,jsp中自带
EL(Expression Language)表达语言。 目的:为了使JSP写起来更加简单。
EL表达式格式${key值}
EL表达式可以从pageContext、request、session和application中取值。
EL表达式取值的顺序是先从pageContext开始,逐一查找request、session、application,找到了显示对应的value值,没找到,什么都不显示
EL表达式可以做运算,加减乘除,逻辑等运算
2.2 EL表达式的语法
1)输出基本数据类型变量
1.1 从四个域自动搜索
${name}
相当于pageContext.findAttribute("name")
(取数顺序:page->request->session->context)
1.2 从指定域获取
${pageScope.name}
域范围: pageScope / requestScope / sessionScope / applicationScope
相当于pageContext.findAttribute("name",REQUEST_SCOPE)
2)输出对象的属性值
${s.name}
相当于pageContext.findAttribute("s").getName()
3)输出集合对象
输出List集合
${list[0]}
${list[1]}
输出map集合
${map["s0"]}
${map["s1"]}
4)在el表达式中调用对象的方法
${student.getNameT()} 调用对象的方法
get方式简写:${student.name}
${list1.size()}
${list1.get(0)} 调用list的方法
${map1.size()}
${map1.get("key1")} 调用map的方法
4)EL表达式计算
算数运算
${10+5}
${10/5}
比较运算
${10>5}
逻辑
${true && false}
${true || false}
字符串判空
${str==null} 判断null的情况
${str==""} 判断空字符串的情况
字符串判空
方式一:
${str==null||str==""}
方式二:
${empty str}
其他
${score>20 ||score <30}
${! empty str }
${name== 'hlp'} 比较字符串是否相同
2.2.1 输出基本类型数据
输出基本类型数据
${name } 相当于 pageContext.findAttribute("name")
${pageScope.name}
${requestScope.name}
${sessionScope.name }
${applicationScope.name} 相当于pageContext.findAttribute("name",scope)
例子:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
<%
request.setAttribute("name", "request_msg");
session.setAttribute("name", "session_msg");
application.setAttribute("name", "context_msg");
%>
<!-- 从四个域自动搜索 -->
${name } <br/>
<!-- 从指定域搜索 -->
从request域中获取:${requestScope.name} <br/>
从session域中获取:${sessionScope.name } <br/>
从context域中获取:${applicationScope.name} <br/>
</body>
</html>
2.2.2 输出对象的属性
输出对象的属性
${student.name} 相当于pageContext.findAttribute("student").getName()
${student.age} 相当于pageContext.findAttribute("student").getAge()
注意:
使用EL表达式输出对象的属性值,其实是调用该对象的属性值的get方法
${studeng.xxx} 相当于pageContext.findAttribute("student").getXxx()
如:
如果Student的属性值为name,获取name属性值的get方法为getNameT();
则使用 ${student.name} 是获取不到数据的
而使用${studeng.nameT} 是可以获取到数据。
使用el表达式获取对象的属性值,其实相当于调用该对象的属性值的get方法。因为属性值是私有的,访问不到。
例子:
获取Student类的name属性,el表达式: ${student.name}
将Student类的name属性的get方法,将名称由getName改为getNameT。
此时el表达式需要改为 : ${student.nameT}
Student.java
public class Student {
private String name;
private int age;
//注意:该get方法的名称
public String getNameT() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
TestServlet.java
public class TestServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student s=new Student();
s.setAge(12);
s.setName("xiaolu");
req.setAttribute("student", s);
req.getRequestDispatcher("/NewFile.jsp").forward(req, resp);
}
}
NewFile.jsp
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
<!-- 输出对象的属性值 -->
输出对象的属性值: ${student.nameT} <br/>
${student.age} <br/>
</body>
</html>
2.2.3 输出集合
el表达式没有遍历功能
输出List集合
##输出List集合
${list[0]}
${list[1]} 相当于pageContext.findAttribute("list").get(0)
方式2:
${list.get(0)}
${list.get(1)} 相当于pageContext.findAttribute("list").get(0)
##获取list的长度
${list.size()}
例1:
TestServlet .java
public class TestServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student s=new Student();
s.setAge(12);
s.setName("xiaolu");
Student s2=new Student();
s2.setAge(12);
s2.setName("xiaolu");
List list=new ArrayList<Student>();
list.add(s);
list.add(s2);
req.setAttribute("list", list);
req.getRequestDispatcher("/NewFile.jsp").forward(req, resp);
}
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
<!-- 输出List对象 -->
方式一:
${list} <br/>
${list[0].name} - ${list[0].age} <br/>
${list[1].name} - ${list[1].age} <br/>
方式二:
${list} <br/>
${list.get(0).name} - ${list.get(0).age} <br/>
${list.get(1).name} - ${list.get(1).age} <br/>
</body>
</html>
输出map集合
${map}
输出map对象
${map["student1"].name}
${map["student2"].name}
相当于pageContext.findAttribute("map").get("student2")
例1:
TestServlet .java
public class TestServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student s=new Student();
s.setAge(12);
s.setName("xiaolu");
Student s2=new Student();
s2.setAge(12);
s2.setName("xiaolu");
Map<String, Student> map=new HashMap<String, Student>();
map.put("student1", s);
map.put("student2", s2);
req.setAttribute("map", map);
req.getRequestDispatcher("/NewFile.jsp").forward(req, resp);
}
}
NewFile.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>EL 表达式获取数据</title>
</head>
<body>
<!-- 输出map对象 -->
方式一:
${map} <br/>
${map["student1"].name} - ${map["student1"].age} <br/>
${map["student2"].name} - ${map["student2"].age} <br/>
</body>
</html>
2.3 总结
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL语法</title>
</head>
<body>
<%
String name = "rose";
//放入域中
//pageContext.setAttribute("name",name);
pageContext.setAttribute("name",name,PageContext.REQUEST_SCOPE);
%>
<%=name %>
<br/>
<%--
1)从四个域自动搜索
--%>
EL表达式: ${name }
<%--
${name } 等价于
<%=pageContext.findAttribute("name")%>
--%>
<%--
2) 从指定的域中获取数据
--%>
EL表达式: ${pageScope.name }
<%--
${pageScope.name } 等价于
<%= pageContext.getAttribute("name",PageContext.PAGE_SCOPE)%>
--%>
</body>
</html>
<%@ page language="java" import="java.util.*,gz.itcast.b_entity.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL输出不同类型的数据</title>
</head>
<body>
<%--
1)EL输出对象的属性
--%>
<%
//保存数据
Student student = new Student("eric",20);
//放入域中
pageContext.setAttribute("student",student);
//List
List<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",28));
list.add(new Student("lucy",38));
//放入域中
pageContext.setAttribute("list",list);
//Map
Map<String,Student> map = new HashMap<String,Student>();
map.put("100",new Student("mark",20));
map.put("101",new Student("maxwell",30));
map.put("102",new Student("narci",40));
//放入域中
pageContext.setAttribute("map",map);
%>
<%--使用EL获取对象 --%>
${student.name} - ${student.age }
<%--
${student.name} 等价于 (点相对于调用getXX()方法)
<%=((Student)pageContext.findAttribute("student")).getName()%>
--%>
<hr/>
<%--使用EL获取List对象 --%>
${list[0].name } - ${list[0].age }<br/>
${list[1].name } - ${list[1].age }<br/>
${list[2].name } - ${list[2].age }
<%--
list[0]等价于 (中括号相对于调用get(参数)方法)
((List)pageContext.findAttribute("list")).get(0)
--%>
<hr/>
<%--使用EL获取Map对象 --%>
${map['100'].name } - ${map['100'].age }<br/>
${map['101'].name } - ${map['101'].age }<br/>
${map['102'].name } - ${map['102'].age }<br/>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式计算</title>
</head>
<body>
<%--
1)算术表达式
+ - * /
--%>
${10+5 }<br/>
${10*5 }
<hr/>
<%--
2)比较运算
> < >= <= == !=
--%>
${10>5 }<br/>
${10<5 }<br/>
${10!=10 }
<hr/>
<%--
3)逻辑运算
&& || !
--%>
${true && false }<br/>
${true || false }<br/>
${!false }<br/>
<hr/>
<%--
4)判空
null 或 空字符串: empty
--%>
<%
//String name = "eric";
//String name = null;
String name = "";
pageContext.setAttribute("name",name);
%>
判断null: ${name==null }<br/>
判断空字符: ${name=="" }<br/>
判空: ${name==null || name=="" }
另一种判空写法: ${empty name }
</body>
</html>
在这里插入
码片