📄 12. jsp note.txt
字号:
5.响应对象
response:
sendRedirect("third.jsp")
sendError(404, "400 Error!")
6.应用对象
application:
log("some body visit our website...");
getMajorVersion()
getMinorVersion()
getServerInfo()
getRequestDispatcher(),getResourceAsStream(),getInitParameter()
pageContext:
getAttribute("name")
config:
getInitParameter("classNo")
getServletName()
page:
getClass()
************************************************************************************************
二、欢迎文件
1.缺省情况下,一个Web App中的 index.html, index.htm, index.jsp 可作为默认的欢迎文件.
当用户请求没有指明要访问的资源时,Web Container会用欢迎文件响应客户端请求.
2.手工设置欢迎文件:
web.xml
找welcome.jsp,没找到,继续往下找
<welcome-file-list>
<welcome-file>/welcome.jsp</welcome-file>
<welcome-file>/welcome1.jsp</welcome-file>
<welcome-file>/welcome2.jsp</welcome-file>
</welcome-file-list>
三、MVC
MVC: Model-View-Controller (用户交互过程:输入、处理、输出)
WEB应用的MVC;优化Web App的结构,使用MVC模式
Model 1: JSP + JavaBean(EJB)
Model 2: Servlet + JSP + JavaBean(EJB)------>MVC
体系结构
设计模式
具体问题提出具体的解决办法
习惯用法
Day4
内容要点: 1 实现文件上传 2 数据验证 3 分页实现
*****************************************************************************************
一、文件上传
1.表单形式
<form action="" method="POST" enctype="multipart/form-data">
file:<input type="file" name="file"/><br/>
<input type="submit"/>
</form>
2.使用HttpMonitor工具:
查看文件上传时,请求的内容。
3.服务器端对上传文件的处理
例子
fileupload
处理步骤(待补充)
知识点:
1)通过HttpServletRequest来传送文件内容
2)处理request头,字符串的分析
3)java.io.File API的使用
*****************************************************************************************
二、数据验证
如何完成Web App中的数据验证工作
1)客户端校验:
输入域不能为空,只能是数字,数据长度大于5等等
JavaScript客户端完成(验证框架,负责客户端方面的验证)
2)服务器端校验:
例如:后台数据库要求提交数据唯一性
Java服务器端完成(没有现成的框架,因为不同的项目有不同的业务规则)
重点:
1)分清楚什么情况下使用客户端校验,什么情况下使用服务器端校验
***************************************************************************************
三、数据分页
查询数据库时,如果满足条件的记录很多,该如何返回给页面?
1.客户端分页
同样地,使用html/javascript等技术处理。甚至可以封装成组件
2.服务器端分页
非常重要的,在实际项目中非常需要————性能问题。
这需要结合JDBC/Hibernate/TopLink/EJB等技术实现。
查询分页
1)一次性从数据库中查出所有信息,在内存中作分页(缓存)
特点:速度非常快,消耗资源大(内存?)
2)分多次查询数据库,一次查询的数据量就是一个页面可以显示的数据量
特点:消耗资源少,相对来说速度慢
3)折衷的方案(一次只取n页,1<n<总页数)(部分缓存)
特点:中庸之道(实现中,置换算法教难)
常见的分页处理方法:定义如下几个参数
rows:数据库表中记录总行数 select count(*) from 表名;
totalPage:总页数 (导出属性:可以由其他属性计算而得) int totalPage = rows / size + 1;
size:每页显示的记录数目 可定制,可写死
curPageNo:当前页 客户端决定
startRowNo:当前页在数据库中的起始行号(导出属性) int startRowNo = (curPageNo -1 ) * size;
练习:
重新改造Usermanager例子中的查询所有的用户的功能(使用分页)
Day5
内容要点: 1 EL 2 JSTL
**************************************************************
一、EL(Expression Language----表达式语言)
为网页美工而设,跟java语句相似;尽量减少java程序的依赖(不能要求美工使用java)
1.语法
表达式 vs. EL表达式语言(JSP2.0)
<%=name%> <=> ${name}
2.文字
在 EL 表达式中,数字、字符串、布尔值和 null 都可以被指定为文字值(常量)。
字符串可以用单引号或双引号定界。布尔值被指定为 true 和 false 。
例子:
表达式 值
-----------------------------------------------------------------------
${-168.18} -168.18
${3.8e-18} 3.8e-18 //科学计数法
${3.14159265} 3.14159265
${"Hello JSP EL!"} Hello JSP EL! 等价于 <%="Hello JSP EL!"%>
${'Hello JSP EL...'} Hello JSP EL...
${true} //can be TRUE? true
${false} //can be FALSE? false
${str==null} true //布尔值的表达式
3.EL 运算符
类别 运算符
-------------------------------------------------------------
算术运算符 +、 -、 *、 /(或 div)、 %(或 mod)
关系运算符 ==(或 eq)、 !=(或 ne)、 <(或 lt)
>(或 gt)、 <=(或 le)、 >=(或 ge)
逻辑运算符 &&(或 and)、 ||(或 or)、 !(或 not)
验证运算符 empty
其中,empty 判断一个变量是否为null或是否包含有效数据:
if(name==null||name.equlas("")) 等价于 ${empty name} -> true
例子:
表达式 值
-------------------------------------------------------------
${3+5.1} 8.1
${"Hello"+",Tarena!"} 报错! // EL的"+"没有字符串连接功能
${5*2} 10
${9.3/3} 3.1
${9.3 div 3} 3.1
${8 div 0} Infinity // 表示无穷大
${9%2} 1
${9 mod 2} 1
${8*6>68?"Yes":"No"} No //三目表达式
<% String name="";
request.setAttribute("name",name); //如果没有 setAttribute ,则必定是空
%>
${empty name} true //对范围对象内的变量或对象进行判空
4.变量和JavaBean属性数据输出
表达式语言输出变量,是到范围对象(pageContext,request,session,application)中查找相应属性。
而非直接在页面中查找实例或局部变量。
表达式语言查找变量的顺序是:
pageContext -> request -> session->application, 所有范围都未找到时,赋值null
5.存取器
[] ->输出对象属性值,输出数组或集合中对应索引值
. ->输出对象属性值
例子:
<% SuperGirl girl = new SuperGirl(); girl.setName("Alice");
session.setAttribute("girl",girl); %> //一定要有这句,设置成范围对象
${girl["name"]}
${girl['name']} //拿属性时,单引跟双引等价
${girl.name} //这种方法同样可以
<% List aList = new ArrayList();
aList.add("China"); aList.add(girl); aList.add(168.18);
session.setAttribute("aList", aList); %>
${aList[0]} //使用下标来取值 "China"
${aList[1]} //取得对象的引用地址 还可以嵌套:${aList[1]['name']}
${aList[3]} //下标越界,不会报错;只是取不出值
<% Map map = new HashMap();
map.put("name", "Kitty"); map.put("age", "25"); map.put("date", new Date());
map.put("aList", aList);
session.setAttribute("map", map); %>
${map.date} ${map["date"]} //这两个等效
${map.aList[0]} ${map["aList"][0]} //这两个也等效
${map.aList[1][name]} //嵌套取值
6.隐含对象
el提供了自己的一套隐含对象,方便在页面内对各种常用数据信息的访问.
EL隐藏对象 JSP隐藏对象
--------------------------------------------------------------------------------
pageScope pageContext
requestScope request
sessionScope session
applicationScope appication
param: request.getParameter()
paramValues: 在提交表单里,有多个输入域同名getParameterValues
header: request.getHeader() 按照key-value的形式取出;value:是一个String类型的值
headerValues 按照key-value的方式取出,但是headerValues里面的value是一个String类型的数组
cookie request.getCookies()
initParam context param
例子:
1)超女登记信息
enroll.html
<form action="index.jsp" method="post">
<table border="1">
<tr><td>姓名:</td>
<td><input type="text" name="name"></td></tr>
<tr><td>年龄:</td>
<td><input type="text" name="age"></td></tr>
<tr><td>城市:</td>
<td><input type="text" name="city"></td> </tr>
<tr><td align="center" colspan="2"><input type="submit" value="提交"></td></tr>
</table>
</form>
index.jsp
<jsp:useBean id="SuperGirl" class="vo.SuperGirl" scope="page"></jsp:useBean>
<jsp:setProperty name="SuperGirl" property="name" value="${param.name}"/>
<jsp:setProperty name="SuperGirl" property="age" value="${param.age}"/>
<jsp:setProperty name="SuperGirl" property="city" value="${param.city}"/>
<table border="1"> <% //把设置输出出来 %>
<tr><td>姓名:</td>
<td>${SuperGirl.name}</td></tr>
<tr><td>年龄:</td>
<td>${SuperGirl.age}</td></tr>
<tr><td>城市:</td>
<td>${SuperGirl.city}</td></tr>
</table>
2)范围对象
<% pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application"); %>
${name} // pageContext -> request -> session->application
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
3)paramValues
在enroll.html加入: 兴趣
<table>
<input type="checkbox" name="habit" value="Reading"/>读书
<input type="checkbox" name="habit" value="Game"/>游戏
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -