l JSP常用标签
1.作用: 移除jsp页面的java代码
在jsp页面写一些标签,jsp引擎会根据标签去调用一个java类的成员方法
2.移除java代码的标签有一下几种:
1)jsp内置了一些标签,我们称作jsp标签或jsp动作元素
2)自定义标签: 自己写一个类,在标签描述文件中描述类和标签的关系
3)jstl标签 : 调用方法
4)el 表达式 : 用于在jsp页面取值
5)el函数: 针对字符串的常用操作
l
l <jsp:include>标签
l <jsp:include>标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
l 语法:
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
ü page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
ü flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
ü <jsp:include>与include指令的比较
ü <jsp:include>标签是动态引入, <jsp:include>标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。
ü 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
ü 不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
ü <jsp:forward>标签
l <jsp:forward>标签用于把请求转发给另外一个资源。
l 语法:
<jsp:forward page="relativeURL | <%=expression%>" />
ü page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
ü <jsp:param>标签
l 当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
l 语法1:
<jsp:include page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
l 语法2:
<jsp:forward page="relativeURL | <%=expression%>">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
l <jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
在JSP中使用JavaBean
l JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:
l <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。
l <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
l <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。
<jsp:useBean>标签
l <jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象
方法中的代码除了遇到return否则必定执行
导包 以及pageencoding 指令 可以冲突
url编码 :%ff 两个16进制数
jap:param 标签会对参数进行url编码
tomcat默认使用iso-8859-1进行url解码
l 常用语法:
<jsp:useBean id="beanName" class="package.class"
scope="page|request|session|application"/>
l 标签体只在对象被创建时才执行
<jsp:setProperty>标签
l <jsp:setProperty>标签用于设置JavaBean对象的属性
l 语法格式:
<jsp:setProperty name="beanName"
{
property="propertyName" value="string " |
property="propertyName" [ param="parameterName" ] |
property= "*"
}/>
name属性用于指定JavaBean对象的名称。
property属性用于指定JavaBean实例对象的属性名。
value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。
param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。
<jsp:getProperty>标签
l <jsp:getProperty>标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。
l 语法:
<jsp:getProperty name="beanInstanceName" property="PropertyName" />
name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同。
property属性用于指定JavaBean实例对象的属性名。
l 如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。
l EL表达式和JSTL标签快速入门
l EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,分别从page、request、session、application四个域中查找相应的对象找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)
l 结合JSTL标签,EL表达式也可轻松获取各种集合中的元素。
l EL表达式也可使用例如${1==1}的形式进行简单的逻辑判断。
l EL表达式支持二元表达式非常好用
语法: ${user!=null?user.name : “”}
l JSTL标签库 (要想迭代就用jstl标签)
1、导入jstl.jar和standerd.jar这两个JSTL的jar文件。
2、在JSP页面中使用<%@ taglib url=“” prifix=“” %>元素导入标签库。
<c:foreach var=“” items=“”> 增强for循环
<c:if test=“”> 条件判断
<jsp:include page="/jsptag/2.jsp" />
动态引入,首先将两个jsp分别翻译成两个Servlet,编译,两个Servlet对象之间实现包含
<%@ include file="/jsptag/2.jsp" %>
静态引入,将两个jsp翻译成一个Servlet
jsp页面包含时需要注意:
1)含的jsp页面不用写jsp模板元素
2)两个jsp页面的指令不能有冲突
有两个指令除外, import 可以冲突,因为有可能导入不同的包
pageEncoding可以冲突,因为两个jsp文件有可能编码格式不一样
用在哪?
比如说页面的头需要一个统一的格式,就可以写一个jsp,让每个页面都来包含
实现请求转发
传参用 param 标签
<jsp:forward page="/jsptag/5.jsp">
<jsp:param name="name" value="老张"/>
</jsp:forward>
param标签会对参数进行url编码 采用的编码是 request.getCharacterEncoding();
<%-- 访问User对象, 设置属性 访问属性
userBean 实例化一个javabean对象,存入指定的域 默认存在page域
标签体只在创建对象的时候才执行,如果域中已经存在对象了,此时不创建,标签体不执行
--%>
<jsp:useBean id="bean" class="cn.itcast.domain.User" />
<jsp:setProperty name="bean" property="username" value="zhangsan" />
<jsp:setProperty name="bean" property="username" param="name" />
<jsp:setProperty name="bean" property="*" />
<%--
String username = ((User)pageContext.getAttribute("bean")).getUsername();
String password = ((User)pageContext.getAttribute("bean")).getPassword();
System.out.println("username = " + username);
System.out.println("password = " + password);
--%>
username : <jsp:getProperty name="bean" property="username"/>
password : <jsp:getProperty name="bean" property="password"/>
sun公司针对web开发提供了两种开发模式
model1: jsp+javabean 只适合开发小型的应用
IE |
form.jsp |
handle.jsp 获得请求参数封装到bean 进行运算 显示结果 |
javabean 封装数据 实体 |
model2: servlet+jsp+javabean (mvc)
问题:
getParameter(key)、getAttribute(key)/setAttribute()有什么区别什么时候用
class Request {
Map attributes = new HashMap(); // 作为域对象
Map parameters = new HashMap(); // 封装请求参数
Map headers = new HashMap();
getAttribute(key) {
return attributes.get(key);
}
getParameter(key) {
return parameters.get(key);
}
getHeader(name) {
}
}
1. 写一个类实现 SimpleTag接口, 这个类就是一个简单标签类
实现一个标签,步骤:
1) 写一个java类,实现SimpleTag接口
doTag
jsp引擎在执行标签时会自动调用该方法
setJspContext
jsp引擎在调用doTag之前会将pageContext对象作为JspContext传递给该方法
setJspBody(JspFragment fragment)
jsp引擎在调用doTag之前会将标签体作为JspFragment对象传递给该方法
JspFragment对象有个invoke方法决定将标签体输出到哪去,
如果传入参数是null,将标签体输出到 JspWriter ,这相当于让标签体执行
setParent
getParent
一般来讲,我们可以通过继承 SimpleTagSupport 类来实现SimpleTag接口
实现SimpleTagSupport类的好处
可以直接通过调用 getJspContext() 方法获得jsp的 PageContext对象
可以直接通过调用 getJspBody() 方法获得jsp的JspFragment对象
2) 在 WEB-INF目录下 建一个tld文件
对标签进行描述
<tag>
对标签的文字性描述
<description>hello world</description>
标签名,就是在jsp页面如何取引用该标签
<name>first</name>
标签类,需要写完整类名
<tag-class>cn.itcast.mytag.FirstTag</tag-class>
标签体的类型,常用: empty(空标签) scriptless(不允许写jsp脚本)
<body-content>empty</body-content>
</tag>
3) 在jsp页面使用taglib指令引入一个标签库
uri属性指定标签库对应的名称空间uri
prefix 指定在jsp页面使用别名
%--
el表达式替换的java代码
Object value = pageContext.findAttribute("name");
if(value==null)
out.print("");
else
out.print(value);
--%>
Username: ${user.username }<br> <%--pageContext.findAttribute("user").getUsername() --%> 后面的注释是翻译的内容
<%-- 迭代标签 相当于增强for循环 --%>
<%-- 迭代arr集合,然后将元素存入page域,var指定的变量作为key
迭代多少次 标签体就执行多少次
--%>
public void doTag() throws JspException, IOException {
// 执行到标签时调用此方法
// 获得request对象
HttpServletRequest request = (HttpServletRequest) this.context.getRequest();
// 获得 对方ip
String ip = request.getRemoteAddr();
// 输出
this.context.getOut().print("您的ip是: " + ip);
}
public JspTag getParent() {
// 获得当前标签的父级标签
return null;
}
// 3
public void setJspBody(JspFragment fragment) {
// jsp引擎会将标签体的内容封装到 fragment 对象传入, 调用此方法
}
// 2
public void setJspContext(JspContext context) {
// jsp引擎会将代表jsp页面的pageContext对象 作为 JspContext类型传进来
this.context = (PageContext) context;
}
// 1
public void setParent(JspTag arg0) {
// 设置父标签对象
}