jsp详细
标准的javaBean,那么标准的javaBean需要什么呢?
1.必须是一个public的类,必须要是有私有的构造方法!
2.字段必须为私有,
3属性必须为public,并且一般都有get和set方法。这是属性,而不是字段,这里可以只有写方法或读方法!这样的话就是只读属性或只写属性!
4.一个javaBean必须继承Serializable
javaBean的作用:
JavaBean在J2EE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。
jsp操作javaBean
在jsp中定义了3个标签:<jsp:useBean><jsp:setProperty><jsp:getProperty>三个标签去操作域下的javaBean对象
Person mine = new Person();
session.setAttribute("mine1",mine);
<jsp:useBean id="bean" class="cn.itheima.domain.Person" scope="page"/>
的代码:
cn.itheima.domain.Person bean = null;
synchronized (_jspx_page_context) {
bean = (cn.itheima.domain.Person) _jspx_page_context.getAttribute("bean", PageContext.PAGE_SCOPE);
if (bean == null){
bean = new cn.itheima.domain.Person();
_jspx_page_context.setAttribute("bean", bean, PageContext.PAGE_SCOPE);
}
}
可与看出来:useBean的作用就是去域对象中找到该Bean 的实例!简写了一个标签!
Id 为在该域中的名字!但是不可以取的和实例对象的名称一样!也就是说不能这样 session.setAttribute("mine",mine);这样的话就会创建一个同名的变量了,必然报错!!!
class是该变量的所属类!该类不可以是抽象的!
scope是域的范围!
scope="page | request | session | application"
注意你的域范围:如果要是有session范围,你的session必须为true!错误提示:invalid value for session
设定属性:
<jsp:setProperty name="p" property="name" param="na"/>
的代码:
org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("p"), "name", request.getParameter("na"), request, "na", false);
可以看出来这是利用了内省,来进行修改javabean的!
特别要注意的是这是一个自闭标签!
name是取到的bean的name,
那么property是指属性名
value是指改变的值!(注意这里的只能是基本类型可以(类型转换)强转!!!如果是一个其他类型的变量,那么只能是用java表达式,其实内部就是在进行强转!!!)
param是指传的参数!
得到属性:
<jsp:getProperty name="p" property="age"></jsp:getProperty>
代码:
out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString((((cn.itheima.domain.Person)_jspx_page_context.findAttribute("p")).getAge())));
由于是直接打印的,所以还是直接输出的!
name为域中的对象,property为属性!
如果这个字符串为空!则输出"null"的字符串
注意:你的setProperty和getProperty是自闭标签,不能有标签体!
如果你的标签是这样的:
<jsp:useBean id="p" class="cn.itheima.domain.Person" scope="page">
<jsp:setProperty name="p" property="name" value="na"></jsp:setProperty>
</jsp:useBean>
那么如果useBean标签中可以定难过了位到一个实体!那么你可以找到在域中的对象,那么你的setProperty就不起作用了!
EL表达式的就是为了去显示数据!
- 通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为””(注意,不是null)。
El的作用:
EL 能实现如下功能:
1) 使用变量访问web域中存储的对象 ${user }
2) 访问javabean的属性 ${user.address.city }
3) 执行基本的逻辑运算
4) 直接使用隐式对象
5) 调用 el 函数
1.基本表达式:
${ el 表达式}
1.pqgeContext.setAttribute("name","lxb");
${name}翻译为servlet就是:
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${name}", java.lang.String.class,
(PageContext)_jspx_page_context, null, false));
我们的el表达式中,可以接受的对象,只有在域对象中的内容!
还有一个特点就是:如果是null的则什么也不输出!
2.点运算:
可以作用的对象:
1,主要是一个Bean对象,这样在表达式中就可以直接点他的属性:
<jsp:useBean id="p" calss="cn.itheima.domain.Person" scope="page">
</jsp:useBean>
这样的话你就可以用${p.name}或者${p.age}来进行取到属性值了!
2或者是一个域中的对象,都可以这样来取到值!(这其实是根本!取域中的javaBean是次要的)
3[]运算
1主要是用这个来进行取到含有:不合法的名称的值,或者是一个动态的值,变量!
两者的用法:
EL提供(.)和([])两种运算符来存取数据,即使用点运算符(.)和方括号运算符([])。
点运算符和方括号运算符可以实现某种程度的互换,如${student.name}等价于${student [“name”]}。
当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号时,就一定要使用[]。例如${student.name }应当改为${student[“name”] }。
如果要动态取值,就可以用[]来做,而.无法做到动态取值。例如${sessionScope.student[data]}中data是一个变量。
4主要的取值:
EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如:
${user.address.city}
${user.list[0]}:访问有序集合某个位置的元素
${map.key} :获得map集合中指定key的值
5El表达式的运算:
可以用到:可一用到一些逻辑运算和一些关系运算
操作符 |
功能和作用 |
. |
访问一个 bean 属性或者 Map entry |
[] |
访问一个数组或者链表元素 |
() |
对子表达式分组,用来改变赋值顺序 |
? : |
条件语句,比如:条件 ?ifTrue:ifFalse 如果条件为真,表达式值为前者,反之为后者 |
+ |
数学运算符,加操作 |
- |
数学运算符,减操作或者对一个值取反 |
* |
数学运算符,乘操作 |
/ 或 div |
数学运算符,除操作 |
% 或mod |
数学运算符,模操作 ( 取余 ) |
== 或 eq |
逻辑运算符,判断符号左右两端是否相等,如果相等返回 true ,否则返回 false |
!= 或 ne |
逻辑运算符,判断符号左右两端是否不相等,如果不相等返回 true ,否则返回false |
< 或 lt |
逻辑运算符,判断符号左边是否小于右边,如果小于返回 true ,否则返回 false |
> 或 gt |
逻辑运算符,判断符号左边是否大于右边,如果大于返回 true ,否则返回 false |
<= 或 le |
逻辑运算符,判断符号左边是否小于或者等于右边,如果小于或者等于返回 true,否则返回 false |
>= 或 ge |
逻辑运算符,判断符号左边是否大于或者等于右边,如果大于或者等于返回 true,否则返回 false |
&& 或and |
逻辑运算符,与操作赋。如果左右两边同为 true 返回 true ,否则返回 false |
|| 或 or |
逻辑运算符,或操作赋。如果左右两边有任何一边为 true 返回 true ,否则返回false |
! 或 not |
逻辑运算符,非操作赋。如果对 true 取运算返回 false ,否则返回 true |
empty |
用来对一个空变量值进行判断 : null 、一个空 String 、空数组、 空 Map 、没有条目的 Collection 集合 |
func(args) |
调用方法 , func 是方法名, args 是参数,可以没有,或者有一个、多个参数 . 参数间用逗号隔开 |
6重要的运算符:empty
这个运算符是为了判断一个对象是否是null或者是“”空串!如果是,则返回true!
7El的三元运算:
expression?true:flase
8el范围有关的隐式对象
这几个对象是有pageContext和其他的
1.与作用范围有关的EL隐含对象包含有:pageScope、requestScope、sessionScope和applicationScope
它们可以读取使用JSP内置对象pageContext、request、session以及application的setAttribute()方法所设定的对象的数值-----即getAttribute(String name),却不能取得其他相关信息。
2.与输入有关的隐式对象
与输入有关的隐含对象有两个,即param和paramValues,它们是EL中比较特别的隐含对象。例如,要取得用户的请求参数时,
3.其他隐式对象
cookie
用来取得使用者的cookie值,例如在cookie中设定了username属性值,可以使用${cookie.username.value}来取得属性值。
4.header和headerValues
读取请求的头数据,使用header或headerValues内置对象,例如${header[“User-Agent”]},headerValues则用来取得所有的头信息,等价于调用request.getHeaders()方法。
5initParam
获得初始参数的信息!在web.xml中配置!也就是ServletConfig的内容!
为什么要把El表达式代替jsp的表达式?
1.El的用法方便,写法见解
2El中子所以要去取出域中的内容,就是由于我们要jsp是来显示的,所以可以替代java表达式!我们只是用到了传来的共享数据的域对象,不会再jsp页面中去创建数据!我们主要是显示数据的,所以我们的El中的主要是显示的功能!!!${****}表达式就是为了方便显示的!!
El表达式内置对象pageContext可以的引用!!!
为:
ELContext,out,errorData,page,exception,request,response,servletContext,servletConfig,session
特别注意的是你可以 ${"jhjjiojio"}在el表达式中显示一个字符串!但是不可以用 ${"jhjjiojio"+1}字符串的加法
1使用el表达式来访问域中的变量name:<br/>
1当你的name在page范围内的时候你可以去调用pageContext或者是pageScope(有区别)<br/>
2在其他域范围的时候,你可以直接访问(小的域中没有该变量)或者调用该域的Scope<br/>
<%
pageContext.setAttribute("name","lxb1");
request.setAttribute("name","lxb");
%>
page :name = ${name} is same to ${pageScope.name}<br/>
request : name=${requestScope.name}<br/>
2 使用el表达式访问数组:<br>
<%
String[] str = new String[]{"lxb","lxb1","lxb2"};
pageContext.setAttribute("names",str);
%>
数组:第一个:${names[0]}第二个:${names[1]}第三个:${names[2]}<br>
3使用el表达式访问Cllection<br/>
<%
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("!");
pageContext.setAttribute("age",list);
%>
访问list = ${age[0]}-${age[1]}-${age[2]}<br/>
4使用el表达式访问map
<%
HashMap map = new HashMap();
map.put("first","100");
map.put("mid","200");
map.put("last","300");
pageContext.setAttribute("money",map);
%>
访问map:=${money.first}-${money.mid}-${money.last}<br/>
5访问javaBean<br/>
<%
Person p = new Person();
p.setName("lxb");
p.setAge("20");
Person p1 = new Person();
p1.setName("lxb1");
p1.setAge("201");
pageContext.setAttribute("myBean",p);
request.setAttribute("mybean",p1);
%>
<jsp:useBean id="my" class="cn.itheima.domain.Person" scope="request">
</jsp:useBean>
访问myBean=${myBean}--${myBean.name}--:--${myBean.age}<br/>
访问myBean=${requestScope.mybean}--${requestScope.mybean.name}--:--${requestScope.mybean.age}<br/>
6使用隐式对象!
<%
Cookie cookie = new Cookie("password","123");
cookie.setMaxAge(100);
response.addCookie(cookie);
%>
使用隐式对象:cookie=${cookie.password.name}---${cookie.password.value}<br/>
request=${param.name}---${pageContext.request.locale}
总之:
在el表达中,你可以用的就是一个域中的对象!那么你可以访问该对象,如果他是一个bean,你可以访问他的的属性,<br/>
如果是一个map那你可以访问他的key,会得到value!
特殊的cookie:你访问一个名为username的cookie那么你就可以这样:
得到cookie的名字${cookie.username.name};
得到cookie的值${cookie.username.value}
由于这个对象是一个map但是cookie就表示map,username表示cookie本身!name和value为cookie的属性!
我们的el表达式都是基于pageContext。findAttribute()的技术的来寻找域中对象的!所以所有的EL都是建立在jsp的基础上!
我们学习jsp的之后用到pageContext的不是为了获得8个隐式对象,而是获得其他域对象中的内容!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。