一、 JavaBean

是一种特殊的java类,它遵从一定的设计模式,开发工具和其他组件可以根据这种模式来调用javaBean。它是使用一种符合某些命名方法和设计规范的java类。

-- 这个类是可序列化的(能够持久保存也能恢复状态),也就是,它必须实现java.io.Serializable接口

-- 这个类必须带有一个无参数的构造方法。

-- 这个类的属性必须通过使用get、set和其他按标准命名规范来命名的方法来操作:

getXxx()和setXxx()用于非布尔属性,isXxx()用于布尔属性。这些方法称之为getters和setters

-- 这个类包含所有必须的事件处理方法。

二、JSP标准动作

标准动作是这样一些标记,它影响JSP运行时的行为和发送给客户的应答,它们应当由所有的包容器来提供,而不管它们的实现如何

==jsp动作元素

<jsp:include> //向一个页面中包含别一个页面(动态引入),  过去霃的是静态引入 <@ include file="xxx" >
<jsp:forward> //页面跳转,服务跳转
<jsp:param> //用来传参数
<jsp:useBean> //用来声明javaBean
<jsp:setProperty> //用来设置参数
<jsp:getProperty> //用来得到参数
<jsp:plugin>

==<jsp: useBean> 标记

<%--
UserInfo user=new UserInfo();
user.setNote("这是备注");
user.setUserName("这是名字"); session.setAttribute("user",user);
--%>
// 相当于下面的写法 //声明一个Bean
<jsp:useBean id="user" class="cat.bean.UserInfo" scope="session" /> /往Bean中存值
<jsp:setProperty name="user" property="userName" value="这是用userBean加的姓名"/>
<jsp:setProperty name="user" property="note" value="这是用userBean备注"/> //取值
<jsp:getProperty name="user" property="userName" />
<jsp:getProperty name="user" property="note" />

== <jsp:include>  标记

把另外一个资源输出的内容插入到当前JSP页面中,称为动态引入.

语法: <jsp:include page="relativeUrl  | <%=expression %> " flush="true/false">

page属性用于指定被引入资源的相对路径,也可以通过执行一个表达式来获得

1) 在当前jsp页面被执行期间插入被引入资源的输出内容,两者是独立的实体,被引入的资源必须是一个能独立被web容器调用和执行的资源

2) 被引入页面不能改变响应状态码,也不能设置响应头

3) 灵活性好

4) 两种include都可以把页面内容分为多个组件来开发

<jsp:include page="top.html">
<jsp:include page="down.html">

5) 两者都应注意 最终输出结果的内容要遵循 html 语法结构,如果当前页面产生了 <html></html><body></body>,被引入的文件中,就不该带有这些标记

6) 对引擎翻译 JSP 页面没有任何影响

==<jsp:forward> 和 <jsp:param >

//相当于服务端跳转
<jsp:forward page="localURL"> //这里的localURL是服务器上存在的一个地址
<jsp:param name="userId" value="zhangsan" />
<jsp:param name="password" value="123" />
</jsp:forward>

===跳转方式的总结

1) form 表单  <form action="XXXServlet" method="get/post" >

2) 超链接 <a href="XXXXServlet" >转</a>

3) <meta http-equiv="refresh" content="3;URL=XXXServlet" />  //隔三秒转向另一个页面

4) response.sendRedirect(URL)

5) <jsp:forward page="localURL">

6) request.getRequestDispatch("XXXServlet").forward(request,response);

7) pageContext.forward("XXXServlet")

跳转的方式:

请求转发的特点:

1.只能在同一个工程内进行页面跳转

2.服务器端的行为

3.多个页面之间共享同一个request对象。

4.跳转后RUL地址栏不变

请求重定向的特点:

1.可以多个工程之间跳转

2.客户端的行为

3.多个页面之间不共享一个request对象

4.跳转后URL地址栏显示跳转后的页面地址

三、EL 表达式

EL (Expression Lanaguage ),jsp 2.0 中新增的一种可以简单化JSP开发的技术

1.语法为 ${表达式}

-- 能访问变量,javaBean属性,集合,数组

-- 能进行算术运算 ,关系,逻辑运算

-- 能访问内置对象

-- 可以在标签中直接使用

优点

1) 可以方便的访问jsp页面的相关数据

登录的Servlet中 request.getSession().setAttribute("user",user);

在 top.jsp中 <%=((UserInfo)session.getAttribute("user")).getUserName() %>

如果用EL   ${user.userName}

//例如:这个写法可以改成
<input type="text" name="num1" value="<%=request.getParameter("num1")==null?"":request.getParameter("num1") %>" >
//这个写法
<input type="text" name="num2" value="${param.num2}" >

什么时候用param ? 如果想代替的是 request.getParameter() ,就用 param,如果想代替的是 request.getAttribute,就不用param了

//例子 在 TestServlet 中
request.setAttribute("goodstudent", "赵明");
request.getRequestDispatcher("test.jsp").forward(request, response);
//test.jsp

<script>
alert('${goodstudent}');
</script>

可以访问嵌套属性   ${userInfo.school.schoolName }

2) 如果计算结果为 null,jsp脚本将输出内容为null 的字符文本,而el会强制将它转换成 "" 后输出这样的处理结果非常有用

<form action="a.jsp" method="get">
<input type="text" name="userName" value='<%=request.getParameter("userName")%>'/> //这样第一次会有null
<input type="text" name="password" value="${param.password }"/> //用el表达式.第一次不会有null
<input type="submit"/>
</form>

3) 可以用 empty()  操作来判断一个参数是否为 null,某个集合或字符串中的内容是否为空

4) 具有类似 javaScript 等脚本语言的优点,能够对字符串,数字等各种类型的数据进行处动转换

2.EL 的基本用法

访问作用域中的变量  ${变量名}--->${userName}

request -> session-> application 顺序依次去找,找到为止,找不到返回null, 如果找到了,则返回其值

如果想显示的指定作用域

${ pageScope.userName}

${ requestScope.userName }   //只从request中找

${ sessionScope.userName }   //只从session中找

${ applicationScope.userName }   //只从session中找

<%
String str="aaaaaa";
session.setAttribute("STR",str); List xxxxList=Dao.getList...
%>
${STR }
${sessionScope.STR } //指定从 session中查找

--访问 map list array

List aList=new ArrayList();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("d");
request.setAttribute("A_LIST",aList); ${A_LIST[0]}
${A_LIST[1]}
${A_LIST[2]}
${A_LIST[3]}

-- 进行运算

${100*99 }
${100>99 }
${100/99 }

--三元运算符

${user!=null?user.name:"用户值为空"}

附: EL 11个内置对象

1 2 3 4)pageScope、requestScope、sessionScope、applicationScope 四个数据范围,用来取值。

5)pageContext 当前jsp上下文 ----- ${pageContext.request.contextPath }   服务的web application 的名称

${pageContext.request.queryString}// 取得请求的参数字符串
${pageContext.request.requestURL}//取得请求的URL,不包括参数字符串
${pageContext.request.method}// 取得HTTP 的方法(GET、POST)
${pageContext.request.protocol} //取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser}//取得用户名称
${pageContext.request.remoteAddr }//取得用户的IP 地址
${pageContext.session.new}//session 是否为新的
${pageContext.session.id}// 取得session 的ID
${pageContext.servletContext.serverInfo}//取得主机端的服务信息

6)${param.name} 等价于 request.getParameter("name")

7)${paramValues.hobby} 等价于 request.getParameterValues("hobby")

8)${header.referer} 等价于 request.getHeader("referer")

9)${headerValues["Accept-Encoding"]} 等价于 request.getHeaders("Accept-Encoding")

10)${initParam.name} 等价于 getServletContext().getInitParamter("name")

11)${cookie.address.value }  //取 key 为 address 的 cookie 值

相当于下面的写法:

Cookie[] cookies = request.getCookies();
if(cookies==null){
out.println("cookie不存在!");
}else{
for(Cookie cookie : cookies){
if(cookie.getName().equals("address")){
out.println(cookie.getValue());
break;
}
}

四、jstl 标签库

JSTL:Java Server Page Standard Tag Library  JSP标准标签库

JSTL由五个不同功能的标签库组成

功能范围  URI 前缀
core http://java.sun.com/jsp/jstl/core c
I18N http://java.sun.com/jsp/jstl/fmt  fmt
SQL http://java.sun.com/jsp/jstl/sql sql
XML http://java.sun.com/jsp/jstl/xml xml
Functions http://java.sun.com/jsp/jstl/functions fn

--- 一般用途标签

<c:out>
<c:set>
<c:remove>
<c:catch>

--- 条件标签

<c:if>
<c:choose>
<c:when>
<c:otherwise>

--- 循环标签

<c:forEach>
<c:forTokens>

--- URL相关标签

<c:import>
<c:url>
<c:redirect>
<c:param>

要引入标签库

jstl1.0的引入方式为:

<taglib uri="http://java.sun.com/jstl/core" prefix="c" />

jstl1.1的引入方式为:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:out> ========================== // 用于输出内容

输出一个字符串

--<c:out value="this is a cat" />

输出一个作用域中的变量

--<c:out value="${name}" />   = ${name}

输出javaBean中的属性

<c:out value="${user.name}" />

输出缺省值

--<c:out value="${cat_name}" default  ="--------------------"/>

<c:set>============================== //在某个作用域中设置变量或javaBean的属性值

scope 属性 可以取 page,reqesut,session,application

--<c:set var="num1" value="ooooooooo" scope="request" />  //<% request.setAttribute("num1","ooooooooo")%>

--<c:set var="num2">qqqqqqqq</c:set>

给javaBean 赋值

<jsp:useBean id="userInfo" class="cn.bean.UserInfo" />

<c:set target="${userInfo}" property="userName" value="张四" />   

<c:set target="${userInfo}" property="password" value="123456" />   

<c:out value="${userInfo.userName}" />

${userInfo.password} //这样取值更简洁    

<c:if>===============================  //条件判断

//例子
<c:set var="age" value="18" />
<c:if test="${ age<20 }">
处对象
</c:if>
//例子
<c:set var="role" value="admin" /> <c:if test="${role!='supperadmin'}">
<input type="button" value="删除" disabled="disabled" />
</c:if> <c:if test="${role=='supperadmin'}">
<input type="button" value="删除"/>
</c:if>

<c:choose><c:when><c:otherwise>==========================//分支条件判断

//例子
<c:set var="fenshu" value="94" scope="request"/> //<% int score=90 ; reqesut.setAttribute("fenshu",90); %>
<c:choose>
<c:when test="${fenshu>90}"> 成绩优秀</c:when>
<c:when test="${fenshu<90&&fenshu>80}">成绩良好</c:when>
<c:otherwise>估计美术会不错</c:otherwise>
</c:choose>

<c:forEach>=============================================//循环

<table ... >
<c:forEach var="u" items="${adminList}" > //非常容易错写成: items=${"adminList"}
<tr>
<td>${u.id }</td>
<td>${u.userName }</td>
<td>${u.password }</td>
<td>${u.note }</td>
<td><a href="admin/admin_edit.jsp?id=${u.id }" >修改</a> | <a onclick="return confirm('确定要删除吗?')"
href="AdminServlet?flag=del&id=${u.id }" >删除</a></td>
</tr>
</c:forEach>
</table>

固定次数的迭代

 <c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>

指定步长的迭代

<c:forEach begin="1" end="10" var="i" step="2">
${i} // 1,3,5,7,9
</c:forEach>

带 status 属性的迭代

<c:forEach begin="1" end="10" var="i" varStatus="s" step="2" >
<br>
值是 ${i} <br>
索引是 ${s.index} <br>
count 是 ${s.count} <br>
是否第一个${s.first} <br>
是否最后一个${s.last}
<hr>
</c:forEach>

URL 操作标签==============================

== <c:import> 把其他静态或动态文件包含到 JSP 页面。

与<jsp:include>的区别是后者只能包含同一个web应用中的文件,前者可以包含其他web应用中的文件,甚至是网络上的资源。

语法:

 <c:import url="url" [context="context"] [value="value"] [scope="..."] [charEncoding="encoding"]></c:import>

<c:import url="url"  varReader="name" [context="context"][charEncoding="encoding"]></c:import>

== 在 a.jsp 中引用百度:

<%@ page contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>
绝对路径引用的实例
<c:import url="http://www.baidu.com" charEncoding="utf-8"/> //注意,这里和上面,都必须是utf-8 ,要不会乱码。使用字符串输出、相对路径引用的实例,并保存在session范围内"
<c:catch var="errorMsg">
<c:import var="userName" url="1.txt" scope="session" charEncoding="gbk"></c:import>
<c:out value="${userName}"></c:out>
</c:catch>
<c:out value="${errorMsg}"></c:out> <%=session.getAttribute("userName")+"ssssssssss" %>
"本例相当于把 1.txt文本中的内容,放到session中,等于 session.setAttribut("userName","文本中内容");
//注意一下catch 的用法
</body>
</html>
 //例子

<%request.setAttribute("url",url); %>
<c:import url="${url}/xtcx/foot/index.htm" /> //注意,它不接受这么写<c:import url="<%=url%>/xtcx/foot/index.htm" />,

== <c:redirect> =========================================

该标签用来实现请求的重定向。例如,对用户输入的用户名和密码进行验证,不成功则重定向到登录页面。或者实现Web应用不同模块之间的衔接

语法:

<c:redirect url="url" [context="context"]/>

或:

<c:redirect url="url" [context="context"]>

<c:param name="name1" value="value1">

</c:redirect>

//例子
<c:redirect url="http://127.0.0.1:8080">
<c:param name="uname">lihui</c:param>
<c:param name="password">11111</c:param>
</c:redirect>

== <c:url> 用于动态生成一个 String 类型的URL,可以同上个标签共同使用,也可以使用HTML的<a>标签实验超链接。

语法:

<c:url value="value" [var="name"] [scope="..."] [context="context"]>

<c:param name="name1" value="value1">

</c:url>

或:<c:url value="value" [var="name"] [scope="..."] [context="context"]/>

//例子

<c:url value="http://127.0.0.1:8080" var="url" scope="session"></c:url>

<a href="${url}">Tomcat首页</a>

五、日期格式化

1、首先包引入:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> //严注意里面不要有多余的空格

2、日期参数:

Date: 2004/04/01:13:30:00 Java format: Thu Apr 01 13:30:00 CST 2004

isoDate: 20040531T235959 Java format: Mon May 31 23:59:59 CDT 2004

3、标签结果:

(日期显示)

<fmt:formatDate value="${date}" type="both"/>   显示格式:2004-4-1 13:30:00

<fmt:formatDate value="${isoDate}" type="both"/>   显示格式:2004-5-31 23:59:59
<fmt:formatDate value="${date}" type="date"/> 显示格式:2004-4-1
<fmt:formatDate value="${isoDate}" type="time"/> 显示格式:23:59:59
<fmt:formatDate value="${isoDate}" type="date" dateStyle="default"/> 显示格式:2004-5-31
<fmt:formatDate value="${isoDate}" type="date" dateStyle="short"/> 显示格式:04-5-31
<fmt:formatDate value="${isoDate}" type="date" dateStyle="medium"/> 显示格式:2004-5-31
<fmt:formatDate value="${isoDate}" type="date" dateStyle="long"/> 显示格式:2004年5月31日
<fmt:formatDate value="${isoDate}" type="date" dateStyle="full"/> 显示格式:2004年5月31日星期一

(日期时间显示)

<fmt:formatDate value="${date}" type="both" pattern="EEEE, MMMM d, yyyy HH:mm:ss Z"/>

显示格式:星期四, 四月 1, 2004 13:30:00 -0600

<fmt:formatDate value="${isoDate}" type="both" pattern="d MMM yy, h:m:s a zzzz" />

<fmt:formatDate value="${这里可以放日期和字符串}" pattern="yyyy年MM月dd日"/>

 //例子:
<%
UserInfo u=new UserInfo();
u.setBirthday(new java.util.Date());
request.setAttribute("user",u);
%> <fmt:formatDate value="${user.birthday}"  type="both" />

Java基础——JSP(三)的更多相关文章

  1. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

  2. java 基础知识三 java变量

    java  基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...

  3. java基础(三章)

    java基础(三章) 一.基本if结构 1.流程图 l  输入输出 l  判断和分支 l  流程线 1.1              简单的if条件判断 if(表达式){            //表 ...

  4. JAVA基础(三)—— 输入输出处理

    JAVA基础(三)-- 输入输出处理 1 输入解析 //Scanner获取输入 import java.util.Scanner; Scanner s = new Scanner(System.in) ...

  5. Java实习生常规技术面试题每日十题Java基础(三)

    目录 1.是否可以从一个static方法内部发出对非static方法的调用? 2.Integer与int的区别? 3.Overload和Override的区别.参数列表相同,返回值不同的方法,是否是重 ...

  6. Java基础——JSP(一)

    一.JSP的由来 在很多动态网页中,绝大多部分内容是不变的,只有局部内容需要动态产生和改变.例如, 一个新闻的浏览次数,只有这个次数是动态改变的,而Servlet程序返回客户端的代码全是java程序动 ...

  7. java基础系列(三)---HashMap

    java基础系列(三)---HashMap java基础系列 java基础系列(一)---String.StringBuffer.StringBuilder java基础系列(二)---Integer ...

  8. Java 基础(三)| IO流之使用 File 类的正确姿势

    为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是 File 类? java ...

  9. JAVA基础第三章-类与对象、抽象类、接口

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  10. 逻辑运算符,if、swtch语句(java基础知识三)

    1.逻辑运算符的基本用法 * A:逻辑运算符有哪些 &(逻辑与) |(逻辑或) !(逻辑非) ^(逻辑异或) &&(短路与) ||(短路或) * 注意事项: * a:逻辑运算符 ...

随机推荐

  1. 使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能

    先来看看下面实时效果演示: 用户点击编辑时,在点击行下动态产生一行.编辑铵钮变为disabled.新产生的一行有更新和取消的铵钮,点击“取消”铵钮,删除刚刚动态产生的行.编辑铵钮状态恢复. 更新与删除 ...

  2. 【CJOJ2375】 【HZOI 2015】偏序 II(cdq分治,树状数组)

    传送门 CJOJ Solution 具体实现参考上一篇Blog(四维偏序) 代码实现1(cdq+cdq+cdq+BIT) /* mail: mleautomaton@foxmail.com autho ...

  3. 【Spark基础】:RDD

    我的代码实践:https://github.com/wwcom614/Spark 1.RDD是Spark提供的核心抽象,全称为Resillient Distributed Dataset,即弹性分布式 ...

  4. poi 读取使用 Strict Open XML 保存的 excel 文档

    poi 读取使用 Strict Open XML 保存的 excel 文档 某项目有一个功能需要读取 excel 报表内容,使用poi读取时报错: 具体错误为: org.apache.poi.POIX ...

  5. Flask-socketio聊天室 (附源码)

    `* A Chat Room Completed with Flask-socketio 功能: 实时消息更新,实时用户上线显示 快捷注册 快捷登陆 表情支持 截图: 使用方法: 安装依赖:pip i ...

  6. C#实现程序的版本升级更新

    我们做了程序,不免会有版本升级,这就需要程序有自动版本升级的功能.那么看看我是如何实现程序自动更新的. 直接上代码: using System; using System.Collections.Ge ...

  7. 理解WSGI

    WSGI是什么? WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义 ...

  8. android初探

    随着nodejs的不断发展,前端的范围越来越大,所以,适当的了解移动端是非常有必要的,比如使用RN开发app,前端必须要和安卓工程师沟通共同开发,那么学习android的基本知识就很重要了,因为目前安 ...

  9. 【Canal源码分析】数据传输协议

    Canal的数据传输有两块,一块是进行binlog订阅时,binlog转换为我们所定义的Message,第二块是client与server进行TCP交互时,传输的TCP协议. 一.EntryProto ...

  10. 阿里云负载不支持 WebSocket 协议与 WSS 和 Nginx 配置问题

    WebSocket 是 HTML5 下一种新的协议.它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的.它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTT ...