JavaWeb-JSP&EL

JSP指令

 

1.概述

JSP有三大指令:page、include、taglib

JSP指令格式:<%@指令名  attr1=" " attr2=" "%>

 

2.page指令

(1)属性名

①pageEncoding:指定当前JSP页面的编码(服务器会将该页面编译为java文件时使用该编码)

②contentType:设置content=type响应头、设置响应字符流的编码。<%@page contentType="text/html;charset=utf-8"%>

    以上两个属性,任意只设置其中一个,另一个都会默认和设置编码相同。若都不设置则默认为ISO编码

③import:导包 

④errorPage:当前页面抛出异常,跳转到errorPage设置的页面上(转发)

⑤isErrorPage:设置当前页面是否为处理错误页面,若为true,会将状态码码设置为500,并且可以使用九大内置对象exception

    只有isErrorPage设置为true时,该jsp才能使用exception,因此不是所有jsp页面都可以使用九大内置对象exception

    除此以外,还可以通过web.xml中配置错误页面

<error-page>
  	<error-code>404</error-code>
  	<location>/error404.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/error500.jsp</location>
  </error-page>
  <error-page>
  	<exception-type>java.lang.RuntimeException</exception-type>
  	<location>/error.jsp</location>
  </error-page>

⑥autoFlush:指定jsp缓冲区满时,是否自动刷新。默认为true,如果设置为false,当缓冲区满时就会抛出异常

⑦buffer:指定缓冲区大小,默认为8kb,通常不需要修改

⑧isELIgnored:是否忽略EL表达式,默认值为false

(2)include:静态包含

    静态include和请求包含RquestDispatcher的include()方法中不同的是,

    静态include是两个jsp页面合为一个页面后共同编译为一个java文件(Servlet),最后编译为.class文件

    后者则是将两个Servlet的响应结合为一个响应发送给客户端

    静态include作用:将一个jsp页面分解为多个页面,分别保存不同的信息,然后通过include组合在一起,这样可以将一个页面中不变的部分,变成一个独立的jsp,或者可以用一个jsp页面写繁琐的jsp代码,然后直接使用include放入另一个主要的jsp页面中。

(3)taglib:导入标签库

>prefix:设置标签库在本页面中使用的前缀名称

>uri:指定标签库位置

 

3.JSP九大内置对象

(1)九大内置对象

①out:等同于response.getWriter(),用来向客户端发送文本数据

②config

③page:当前jsp页面的"this",也就是当前对象

pageContext(****):页面上下文对象,域对象

⑤exception:旨在错误页面中可以使用该对象

⑥request

⑦response

⑧session

(2)pageContext:

考虑到域,其自然会有getAttribute,setAttribute,moveArrribute三个方法,并且还需要考虑到每个域的范围

Servlet中有三大域,JSP中有四大域

Servlet:

>ServletContext:用于整个应用程序

>session:整个会话(一个会话中只有一个用户,浏览器关闭则会话结束)

>request:一个请求链

>pageContext:一个JSP页面。该域是jsp页面中使用的标签之间共享的数据

  pageContext功能:①可以获取其他域中的数据(因为可以获取内置对象) ②可以获取当前jsp中的九大内置对象 ③可以全域查找数据,从小范围的域中查起(****)

 

3.JSP动作标签

    JSP动作标签和HTML标签有本质区别:

①JSP动作标签的解析是通过服务器,就如Servlet本质是java文件,由服务器进行解析

②HTML标签的解析是由浏览器进行解析

JSP动作标签的作用:

举例子:<jsp:forword>的作用就是Servlet中请求转发forword()的作用

             <jsp:include>的作用就是Servlet中请求包含include()的作用

因此会有问<%@ include%>和<jsp:include>的区别

其区别就在于前者是静态包含,是将两个jsp文件结合为一个java文件在进行编译为.class文件

后者是动态包含,是将两个jsp文件编译为两个java文件进而编译为两个.class文件之后将响应结合发送给服务器

<jsp:param name="" value="">用来向传递被转发或者被包含页面的参数

 

4.JavaBean

 

(1)JavaBean规范

         ①必须要有默认构造器

         ②所有成员变量都提供了对应的get/set方法,当只有get方法时成为只读属性。

           (成员变量和属性时是两个事物)

         ③属性:有get/set方法的成员,还可以没有成员,只有get,set方法,属性名称由get/set方法来决定,而不是成员变量决定。

(2)Introspector(称为内省)

          其主要是为了能够得到JavaBean属性读写方法的反射对象,通过反射对JavaBean属性进行读写操作的一组API。

          举例:向Map中put两组键值对:

         

Map<String,String> map = new HashMap<String,String>();

map.put("username","admin");
map.put("password","961020");

      

public class User {
	private String username;
	private String password;
	public Person() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

如果此时想要将map中的数据封装到User对象(JavaBean)中,此时可以使用内省,通过内省中的API对User对象中的属性进行写操作。和反射不同的是,反射可以直接获得User的属性,但考虑到其为私有,就会产生安全性问题,所以相对不可靠。如果使用内省,就可以通过get set方法对User对象进行操作。

①通过内省获得JavaBean的信息对象: BeanInfo beanInfo = Introspector.getBeanInfo(User.class);

②通过BeanInfo获得属性描述符(PropertyDescriptor).可以通过BeanInfo获得JavaBean的所有属性的PropertyDescriptor对象

③通过PropertyDescriptor对象获得属性的getter/setter方法的method对象

   >每个PropertyDescriptor对象都对应一个JavaBean属性;

   >String getName():获取JavaBean属性名称

   >Method getReadMethod:获取属性的读方法

   >Method getWriterMethod:获取属性的写方法

④完成Map数据封装到User对象中

public void fun1() throws Exception {
		Map<String,String> map = new HashMap<String,String>();
		map.put("username", "admin");
		map.put("password", "admin123");
		
		BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
		
		PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
		
		User user = new User();
		for(PropertyDescriptor pd : pds) {
			String name = pd.getName();
			String value = map.get(name);
			if(value != null) {
				Method writeMethod = pd.getWriteMethod();
				writeMethod.invoke(user, value);
			}
		}
		
		System.out.println(user);
	}

(3)commons-beanutils

   ①设置JavaBean属性

User user = new User();
		
		BeanUtils.setProperty(user, "username", "admin");
		BeanUtils.setProperty(user, "password", "admin123");
		
		System.out.println(user);

②获取JavaBean属性

User user = new User("admin", "admin123");
		
		String username = BeanUtils.getProperty(user, "username");
		String password = BeanUtils.getProperty(user, "password");
		
		System.out.println("username=" + username + ", password=" + password);

③封装Map数据到JavaBean中(直接将整个Map中的键值对数据放到User对象中)

Map<String,String> map = new HashMap<String,String>();
		map.put("username", "admin");
		map.put("password", "admin123");
		
		User user = new User();

		BeanUtils.populate(user, map);
		
		System.out.println(user);

以后可以使用BeanUtils将表单中的数据一句封装到JavaBean中。

 

(4)jsp中与javaBean相关标签

<jsp:useBean>:创建或查询javaBean

<jsp:setProperty>

<jsp:getProperty>

<jsp:useBean id="user1" class="cn.itcast.domain.User" />

<jsp:useBean id="user1" class="cn.itcast.domain.User" scope="page"/>
<jsp:useBean id="user2" class="cn.itcast.domain.User" scope="request"/>
<jsp:useBean id="user3" class="cn.itcast.domain.User" scope="session"/>
<jsp:useBean id="user4" class="cn.itcast.domain.User" scope="applicatioin"/>

<jsp:useBean id="user1" class="cn.itcast.domain.User" />
<jsp:setProperty property="username" name="user1" value="admin"/>
<jsp:setProperty property="password" name="user1" value="admin123"/>

用户名:<jsp:getProperty property="username" name="user1"/><br/>
密 码:<jsp:getProperty property="password" name="user1"/><br/>

5.EL表达式

(1)EL概述

          JSP2.0要将html和css分离、要把html和javasript分离、要把Java脚本换成EL,也就是不包含<%%>

       ,EL是一门表达式语言,它对应<%=...%>,在jsp中,表达式会被输出,所以EL表达式也会被输出

  (2)格式:${...}

  (3)11个内置对象

①param:对应参数,它是一个map,其中key为参数名,value是参数值,适用于单值

②paramValues:Map<String,String[]>,即适用多值

③header:对应请求头,是一个Map,key为请求头名称,value是请求头对应的值,适用于单值

④headerValues:适用于多值

⑤initParam:获取<context-param>内的参数

   其中<context-param>是用来设置参数名称和参数值,例如

<context-param>
<param-name>xxx</param-name>
<param-value>XXX</param=value>
</context-param>

<context-param>
<param-name>yyy</param-name>
<param-value>YYY</param=value>
</context-param>

可以通过${initParam.xxx}来获取相应的参数值

⑥cookie:Map<String,cookie>,key为cookie的名称,value为cookie对象

⑦pageContext为pageContext的类型

    ${pageContext.request.contextPath }:获取当前项目名称

 

6.EL函数库

(2)自定义EL函数

         ①写一个自定义函数

         ②创建.tld文件,将文件放在/WEB-INF文件下

           

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
    
  <tlib-version>1.0</tlib-version>
  <short-name>itcast</short-name>
  <uri>http://www.itcast.cn/jsp/functions</uri>

  <function>
    <name>test</name>
    <function-class>cn.itcast.el.funcations.ItcastFuncations</function-class>
    <function-signature>String test()</function-signature>
  </function>
</taglib>

         ③在jsp页面中添加taglib指令,导入自定义标签库

         ④使用EL语句:${itcast:test() }访问自定义类中的方法

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="itcast" uri="/WEB-INF/itcast.tld" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <body> 
  	<h1>${itcast:test() }</h1>
  </body>
</html>

        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值