jsp标签和el表达式

1、jsp标签和el表达式

    (1)什么是jsp标签?
        因为直接在jsp页面当中写java代码,不利于jsp页面的维护(比如,将jsp页面交给美工去修改,因为美工很有可能不懂得java代码的知识,容易改错),所以,sun公司提供了jsp标签来代替jsp页面中的java代码。jsp标签类似于html或者xml中的标签,标签会对应于一个标签类,容器会依据标签找到对应的标签类,然后调用标签的代码。
    (2)什么是el表达式?
        el表达式是一套简单的计算规则,用于给jsp标签的属性赋值,也可以直接输出。
    (3)jsp标签是如何运行的?
        容器依据标签的命名空间找到标签的描述文件(容器会从WEB-INF\下查找,找不到,再查找WEB-INF\lib下的jar文件),接下来,依据标签的名称找到标签的描述(标签类的名称),然后将这个标签类通过反射实例化,调用其方法。
    (4)el表达式的使用
        1)访问bean的属性  
            a,方式一   
                ${user.name}
                    a1,执行过程:
                         容器会依次从pageContext、request、session、application中查找绑订名称为"user"的对象(getAttritube("user")),找到后,调用该对象的getName方法然后输出。
                       注意:是依次查找,找不到才向下一个查找
                    a2,优点
                        除了简洁以外,还有两个优点:
                        优点1:会将null转换成""输出。
                        优点2: 如果依据绑订名称找不到相应的对象,不会出现空指针异常,会输出""。
                    a3,注意属性名称不要写错,否则会出错。
                    a4,如果要指定查找范围,可以
                        ${pageScope.user.name}
                        ${requestScope.user.name}
                        ${sessionScope.user.name}

                        ${applicationScope.user.name}

                如:(e1.jsp)

<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		<%
			User user = new User();
			user.setName("tom");
			user.setAge(22);
			request.setAttribute("user",user);
			
			User user2 = new User();
			user2.setName("jetty");
			user2.setAge(22);
			session.setAttribute("user",user2);
		 %>
		 name:<%
		 	//User user1 = (User)request.getAttribute("user1");
		 	//out.println(user1.getName());
		  %>
		  <br/>
		  name:${sessionScope.user.name}  
	</body>
</html><span style="font-size:14px;">      </span>

            b,方式二
                    ${user['name']}
                        b1,[]里面允许出现变量(就是绑订名称)

                        b2,[]里面允许出现从0开始的整数,用来访问数组中的某个元素。

               如:(e2.jsp)

<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		<%
			User user = new User();
			user.setName("tom");
			user.setAge(22);
			user.setInterest(new String[]{"snooker","football"});
			request.setAttribute("user",user);
		 %>
		 name:${user['name']}
		 <%
		 	request.setAttribute("propname","name");
		  %>
		 name:${user[propname]}
		 interest:${user.interest[0]} 
	</body>
</html>

        2)进行一些简单的计算
            a,算术运算: +,-,*,/,%,注意,"+"不能连接字符串,只能求和。
            b,关系运算: >,>=,<,<=,==,!=
            c,逻辑运算: &&,||,!
            d,empty运算: 用来判断一个字符串是否为空,或者一个集合是否为空。
                以下四种情况,结果为true。
                    空字符串
                    空的集合
                    值为null

                    找不到值

           如:(e3.jsp)

<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		算术运算<br/>
		${1+1}<br/>
		${"100" + "200"}
		关系运算<br/>
		${1>0}<br/>
		<%
			request.setAttribute("str1","abc");
		 %>
		${"abc" == str1}
		<br/>
		逻辑运算<br/>
		${1 >0 && 2 > 1 }
		empty运算<br/>
		<%
			request.setAttribute("str2","");
		 %>
		空字符串: ${empty str2 }<br/>
		<%
			List list = new ArrayList();
			//list.add("abc");
			request.setAttribute("list",list);
		 %>
		 空的集合:${empty list}<br/>
		 <%
		 	request.setAttribute("obj",null);
		  %>
		 值为null:${empty obj}<br/>
		 找不到值:${empty abc}	 
	</body>
</html>

        3)获取请求参数值
            ${param.username}
                等价于request.getParameter("username");
            ${paramValues.city}

                等价于request.getParameterValues("city");

           如:(e4.jsp)

<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		username:${param.username}<br/>
		city:${paramValues.city[0]}
	</body>
</html>

        案例: e5.jsp

            使用el表达式输出员工的所有信息。Employee(id,name,salary,age)

准备工作:实体类设计(省略),导入jstl.jar,standart.jar(这里下载)

<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		 id:${e.id}<br/>
		 name:${e.name}<br/>
		 salary:${e.salary + 1000}<br/>
		 age:${e.age}<br/>
	</body>
</html>

   

public class ActionServlet extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String uri = request.getRequestURI();
		String action = uri.substring(uri.lastIndexOf("/"),
				uri.lastIndexOf("."));
		if(action.equals("/list")){
			Employee e = new Employee();
			e.setId(1);
			e.setName("tom");
			e.setSalary(20000);
			e.setAge(22);
			request.setAttribute("e",e);
			request.getRequestDispatcher("e5.jsp")
			.forward(request, response);
		}else if(action.equals("/list2")){
			List<Employee> employees = 
				new ArrayList<Employee>();
				for(int i=0;i<8;i++){
					Employee e = new Employee();
					e.setName("emp00" + (i + 1));
					e.setAge(22);
					employees.add(e);
				}
				request.setAttribute("employees",employees);
				request.getRequestDispatcher("jstl03.jsp")
				.forward(request, response);
		}
		
	}

}

配置web.xml

  <servlet>
    <servlet-name>ActionServlet</servlet-name>
    <servlet-class>web.ActionServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ActionServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

     (5)jstl标签的使用

        1)jstl(java standard tag lib)是什么?
            是apache提供的一套通用的jsp标签。
        2)编程步骤
            step1,将jstl标签对应的jar文件拷贝到WEB-INF\lib下。

            MyEclipse 5.5.1 GA\eclipse\plugins\com.genuitec.eclipse.j2eedt.core_5.5.1\data\libraryset\JSTL1.1\libstandard.jar     jstl.jar

            step2,使用taglib指令引入标签。
                <%@taglib uri="" prefix=""%>
                uri:命名空间(是用来区分同名的元素的,一般会使用域名,因为域名总是唯一的)。
                prefix:指定命名空间的前缀(因为直接将命名空间放到元素的前面太长,不方便,所以,经常使用前缀来代替真正的命名空间)。
        3)核心标签
            a, if标签
                <c:if test="" var="" scope="">
                    标签体
                </c:if>    
                当test属性值为true时,容器会执行标签体的内容。标签体可以是html,也可以是java代码。test属性可以使用el表达式来赋值。
                var属性指定一个绑订名称。

                scope属性指定绑订的范围("page","requst","session","application")。

               如:(jstl01.jsp)

<%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8" %>
<%@page import="bean.*" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" 
prefix="c" %>
<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		<%
		 	Employee e = new Employee();
		 	e.setGender("m");
		 	request.setAttribute("e",e);
		 %>
		 性别:<c:if test="${e.gender == 'm'}" 
		 var="rs" scope="request">男</c:if>
		 <c:if test="${!rs}">女</c:if> 
	</body>
</html>

            b,choose标签
                <c:choose>
                    <c:when test="">
                    </c:when>
                    <c:otherwise>
                    </c:otherwise>
                </c:choose>
                when表示一个分支,可以现1次或者多次;
                otherwise表示例外,可以出现0次或者1次。

                test属性用法同if标签。

              如:(jstl02.jsp)

<%@page pageEncoding="utf-8" contentType="text/html;charset=utf-8" %>
<%@page import="bean.*" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" 
prefix="c" %>
<html>
	<head></head>
	<body style="font-size:30px;font-style:italic;">
		<%
			Employee e = new Employee();
		 	e.setGender("x");
		 	request.setAttribute("e",e);
		 %>
		 性别:<c:choose>
		 	<c:when test="${e.gender == 'm'}">男</c:when>
		 	<c:when test="${e.gender =='f'}">女</c:when>
		 	<c:otherwise>保密</c:otherwise>
		 </c:choose>
	</body>
</html>

            c,forEach标签
                遍历集合
                <c:forEach items="" var="" varStatus="">
                </c:forEach>
                items属性用来指定要遍历的集合,可以使用el表达式来赋值。
                var属性用来指定一个绑订名称,绑订的范围是pageContext,容器每次从集合当中取一个元素,然后放到pageContext对象上。
                varStatus用来指定一个绑订名称,绑订值是一个由容器创建的对象,该对象封装了当前迭代的状态:
                        getIndex(): 返回当前迭代的元素的下标(从0开始)

                        getCount():返回当前是第几次迭代(从1开始)

               如:(jstl03.jsp)

<%@page pageEncoding="utf-8" 
contentType="text/html;charset=utf-8" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" 
prefix="c" %>
<html>
	<head>
		<style>
			.row1{
				background-color:#fff8dc;
			}
			.row2{
				background-color:yellow;
			}
		</style>
	</head>
	<body style="font-size:30px;font-style:italic;">
		 <table width="60%" border="1" 
		 cellpadding="0" cellspacing="0">
		 	<tr>
		 		<td>序号</td>
		 		<td>姓名</td>
		 		<td>年龄</td>
		 		<td>index</td>
		 	</tr>
		 	<c:forEach items="${employees}" var="e" 
		 	varStatus="s">
		 		<tr class="row${s.index % 2 + 1}">
		 			<td>${s.count}</td>
		 			<td>${e.name}</td>
		 			<td>${e.age}</td>
		 			<td>${s.index}</td>
		 		</tr>
		 	</c:forEach>
		 </table>
	</body>
</html>

    (6)自定义标签
        step1,写一个java类,继承SimpleTagSupport类。
        step2,在doTag方法里面,编写处理逻辑。
        step3,配置(在.tld文件里面,描述标签)
            <body-content>元素的值可以是:
            empty: 没有标签体。
            scriptless:有标签体,但是,标签体的内容不能够出现java代码(<%  %>,<%=  %>,<%! %>)

            JSP:有标签体,并且,标签体的内容可以是java代码(只有复杂标签技术才支持)。

2、javaee5.0,如何使用el表达式和jstl?

    (1)javaee是sun公司为了解决企业级开发中的各种问题而提出了一系列规范及相应的api。
    (2)javaee包含了servlet和jsp规范。
    (3)javaee与servlet规范的对应关系
        j2ee1.4  ---> servlet2.4
        javaee5.0 --->servlet2.5
    (4)tomcat版本与servlet规范的对应关系
        tomcat5.5 ---> servlet2.4
        tomcat6.0 ---> servlet2.5
    我们在开发一个web应用时,应该保证程序使用的servlet规范与容器使用的规范一致。
        比如,我们使用javaee5.0开发web应用,应该使用tomcat6.0,如果使用tomcat5.5,el表达式不会被执行。

        如果要使用jstl,不用再将jstl相关的jar文件拷贝到WEB-INF\lib下,因为javaee5.0已经包含了相应的jar文件。



你可能感兴趣的:(jsp,标签)