jsp详细

标准的javaBean,那么标准的javaBean需要什么呢?

1.必须是一个public的类,必须要是有私有的构造方法!

2.字段必须为私有,

3属性必须为public,并且一般都有getset方法。这是属性,而不是字段,这里可以只有写方法或读方法!这样的话就是只读属性或只写属性!

4.一个javaBean必须继承Serializable

javaBean的作用:

JavaBeanJ2EE开发中,通常用于封装数据,对于遵循以上写法的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是取到的beanname

那么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"的字符串

注意:你的setPropertygetProperty是自闭标签,不能有标签体!

 

如果你的标签是这样的:

<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的属性,或获取数组、CollectionMap类型集合的数据,例如:

${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的三元运算:

expressiontrueflase

8el范围有关的隐式对象

这几个对象是有pageContext和其他的

1.与作用范围有关的EL隐含对象包含有:pageScoperequestScopesessionScopeapplicationScope

它们可以读取使用JSP内置对象pageContextrequestsession以及applicationsetAttribute()方法所设定的对象的数值-----getAttribute(String name),却不能取得其他相关信息。

 

2.与输入有关的隐式对象

与输入有关的隐含对象有两个,即paramparamValues,它们是EL中比较特别的隐含对象。例如,要取得用户的请求参数时,

 

3.其他隐式对象

cookie

用来取得使用者的cookie值,例如在cookie中设定了username属性值,可以使用${cookie.username.value}来取得属性值。

4.headerheaderValues

读取请求的头数据,使用headerheaderValues内置对象,例如${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表达式都是基于pageContextfindAttribute()的技术的来寻找域中对象的!所以所有的EL都是建立在jsp的基础上!

我们学习jsp的之后用到pageContext的不是为了获得8个隐式对象,而是获得其他域对象中的内容!

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。