文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.05.04 | lutianfei | none |
<session-config>
<session-timeout>30</session-timeout>
</session-config>
* 调用session.invalidate() 手动销毁session
*.jsp
– 选择MyEclipse JSP Editor – default<!-- -->
JSP文件的阶段存在,在翻译成java文件也存在, 在页面存在<%-- JSP的注释 --%>
只会存在JSP文件的阶段,编译阶段消失。功能
语法:<%@ 指令元素 属性名=属性值 %>
: <%@ directive [ attribute =“value” ] %>
分类
<%@ page
和%>
之间。在JSP页面中,只有import
可以出现多次,其它属性都只能出现一次
属性:
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/500.jsp</location>
</error-page>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" buffer="8kb" autoFlush="true" errorPage="/jsp/error.jsp" isELIgnored="false"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>欢迎</h4>
<% List list = new ArrayList(); // int a = 10 / 0; request.setAttribute("username", "小风"); %>
<!-- HTML的文本 -->
${ username }
</body>
</html>
<%@ include file=“filename” %>
<% String url="index.html" ; %>
<%@ include file = "<%= url %>" %>
<%@ include file = "jw.jsp?nm=browser" %>
//head.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h3>网站的LOGO</h3>
//////
//menu.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h3>网站的超链接</h3>
///////
//foot.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h3>网站的友情链接</h3>
//////
//body.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="/include/head.jsp" %>
<%@ include file="/include/menu.jsp" %>
<h3>网站的新闻(数据变化)</h3>
<%@ include file="/include/foot.jsp" %>
</body>
</html>
JSTL
uri
标签文件的URI地址prefix
标签组的命名空间前缀<%taglib %>
request
response
session
application
out
pageContext
page
config
exception
内置对象 | 真实的对象 | 方法 |
---|---|---|
request | HttpServletRequest | setAttribute() getAttribute() |
response | HttpServletResponse | addCookie() getWriter() |
session | HttpSession | setAttribute() getAttribute() |
application | ServletContext | setAttribute() getAttribute() |
config | ServletConfig | getInitParameter() getInitParameterNames() |
exception | Throwable | getMessage() |
page | this(HttpServlet)Object | (不使用对象) |
out | JspWriter | write() print() |
pageContext | PageContext | setAttribute() getAttribute() |
java.lang.Trowable
类的实例isErrorPage="true"
,才能使用exception对象。<%@ page isErrorPage=”true “%>
的页面内使用
<%= "HELLO" %>
<% out.print("AAAA"); %>
<% response.getWriter().print("BBBB"); %>
<% out.print("CCCC"); %>
* 输出结果:
//BBBB HEELO AAAA CCCC
javax.servlet.jsp.PageContext
类的实例对象,可以使用PageContext类的方法。pageContext对象提供了对JSP页面所有的对象及命名空间的访问。pageContext对象提供了page范围的存取方法
pageContext也是域对象
,代表当前的页面范围,在当前的页面范围内获取数据。
获取其他8个内置对象。
pageContext中的方法:
JSP的四种数据范围
通过pageContext获得其他对象(默认从最小的域开始取)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=request.getParameter("username") %>
<h4>pageContext向其他域中存入值</h4>
<% pageContext.setAttribute("name", "美美"); // 下面这句等价于上面 pageContext.setAttribute("name", "美美", pageContext.PAGE_SCOPE); request.setAttribute("name", "小凤"); // 向request域中存入值 pageContext.setAttribute("name", "小凤", pageContext.REQUEST_SCOPE); // 向session域存入值 pageContext.setAttribute("name", "小苍", pageContext.SESSION_SCOPE); // 向ServletContext域存入值 pageContext.setAttribute("name", "小班长", pageContext.APPLICATION_SCOPE); %>
<%= pageContext.getAttribute("name", pageContext.SESSION_SCOPE)%>
<%= session.getAttribute("name") %>
${ pageScope.name }
${ requestScope.name }
${ sessionScope.name }
${ applicationScope.name }
</body>
</html>
Jsp Action(JSP动作)元素
,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。<jsp:useBean>
使用一个ID和一个给定作用范围和同一ID的JavaBean相关联<jsp:setProperty>
设置JavaBean的属性值<jsp:getProperty>
取得JavaBean的属性值<jsp:include>
页面的包含(服务器端路径,没有项目名称) <jsp:forward>
在JSP的页面中完成转发(服务器端路径,没有项目名称) <jsp:param>
传递参数,需要写在<jsp:forward>
的中间 <jsp:forward>
和<jsp:param>
<jsp:forward page=“转发路径”} />
<jsp:param>
用来传递参数,可以写在<jsp:forward>
中间,可以使用request.getParameter();
来接收参数
param,forward 练习
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>JSP的动作标签</h4>
<jsp:forward page="/jsp/pageContext.jsp">
<jsp:param name="username" value="meimei"/>
</jsp:forward>
</body>
</html>
在Servlet中如果使用request.getRequestDispatcher.forward
进行页面跳转,那么该语句以后的代码会执行:
request.getRequestDispatcher.forward(“XXX”);
System.out.println(“It can execute…”);
但是JSP中<jsp:forward>
后面的代码不会执行,因为翻译的时候,Serlvet容器自动为<jsp:forward>
后面添加了return语句。
<% String s=request.getRemoteAddr(); if(s.startsWith("10.28.176.",0)){ %>
<jsp:forward page="index_inner.jsp"/>
<%}else{ %>
<jsp:forward page="index_outter.jsp"/>
<% } %>
<jsp:include>
与include
指令的比较<jsp:include>
标签是动态引入, <jsp:include>
标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。 include指令
是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。不管是<jsp:include>
标签,还是include指令
,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。
主要有两个方面的不同:
<%@?include?file=“relativeURI”%>
是在翻译阶段执行;<jsp:include?page=“relativeURI”?flush=“true”?/>
在请求处理阶段执行。<%@?include?file=“relativeURI”%>
引入静态文本(html,jsp),在JSP页面被转化成servlet之前和它融和到一起。<jsp:include?page=“relativeURI”?flush=“true”?/>
引入执行页面或servlet所生成的应答文本。/
开头,那么它就是一个环境相关的路径,将根据赋给应用程序的URI的前缀进行解释;如果它不是以斜杠开头,那么就是页面相关的路径,就根据引入这个文件的页面所在的路径进行解释。<!-- index.jsp --> 无法编译
<% int num = 100; if (num > 10) { %>
<%@ include file="a.jsp"%>
<% } else { %>
<%@ include file="b.jsp"%>
<% } %> 一起编译执行
<!-- index.jsp --> 显示正常a.jsp
<% int num = 100; if (num > 10) { %>
<jsp:include page="a.jsp" />
<% } else { %>
<jsp:include page="b.jsp" />
<% } %> else无法执行
<!-- b.jsp 是一个有错误-->
<%=new java.util.Date()<u style="text-underline:single">;</u> %>
<jsp:forward>
<jsp:forward page={"relativeURL" | "<%= expression %>"} /> <jsp:forward page={"relativeURL" | "<%= expression %>"} > <jsp:param name="PN" value="{PV | <%= expression %>"}/> * </jsp:forward>
<jsp:forward>
之后的代码不执行public class User(){
private String username;
private String password;
public void setUsername(){
}
public void getUsername(){
}
public void getPassword(){
}
public void getInfo(){
}
}
作用:
把数据封装到JavaBean中(JSP页面中完成的)
<jsp:useBean id="u" class="cn.itcast.vo.User"></jsp:useBean>
<jsp:setProperty property="username" name="u"/>
<jsp:setProperty property="password" name="u"/>
或者
<jsp:setProperty property="*" name="u"/>
<jsp:getProperty property="username" name="u"/>
<jsp:getProperty property="password" name="u"/>
属性修改器
,getter方法称为属性访问器
。属性修改器
必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写 属性访问器
通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写 <jsp:useBean>
标签:用于在JSP页面中查找或实例化一个JavaBean组件。<jsp:setProperty>
标签:用于在JSP页面中设置一个JavaBean组件的属性。<jsp:getProperty>
标签:用于在JSP页面中获取一个JavaBean组件的属性。
编写表单页面,把数据提交到另一个JSP的页面,可以使用传统方式封装数据,也可以使用<jsp:userBean>
来封装数据。
<jsp:setProperty name=“u” property=“*”>
: *
代表所有的属性<jsp:useBean>
标签<jsp:useBean>
标签用于在指定的域范围内查找指定名称的JavaBean对象: <jsp:useBean id="beanName" class="cn.itcast.Test" scope="page|request|session|application"/>
id属性
用于指定JavaBean实例对象的引用名称
和其存储在域范围中的名称。class属性
用于指定JavaBean的完整类名(即必须带有包名)。scope属性
用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page。<jsp:useBean>
执行原理
<jsp:useBean id="currentDate" class="java.util.Date"/>
//翻译成的Servlet源码:
java.util.Date currentDate = null;
synchronized (_jspx_page_context) {
currentDate = (java.util.Date)_jspx_page_context.getAttribute(
"currentDate", PageContext.PAGE_SCOPE);
if (currentDate == null){
currentDate = new java.util.Date();
_jspx_page_context.setAttribute("currentDate",
currentDate, PageContext.PAGE_SCOPE);
}
}
<jsp:useBean>
标签 <jsp:useBean ...>
Body
</jsp:useBean>
<jsp:useBean>
标签创建JavaBean的实例对象时才执行。<jsp:setProperty>
标签<jsp:setProperty>
标签用于设置和访问JavaBean对象的属性。 <jsp:setProperty name="beanName"
{
property="propertyName" value="{string | <%= expression %>}" |
property="propertyName" [ param="parameterName" ] |
property= "*"
}/>
name属性
用于指定JavaBean对象的名称。 property属性
用于指定JavaBean实例对象的属性名。value属性
用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。param属性
用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。<jsp:getProperty>
标签<jsp:getProperty>
标签用于读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进输出的响应正文中。<jsp:getProperty name="beanInstanceName" property="PropertyName" />
name属性
用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>
标签的id属性值相同。 property属性
用于指定JavaBean实例对象的属性名。<jsp:getProperty>
标签输出该属性的结果将是一个内容为“null”的字符串。@Test
public void run() throws Exception{
User user = new User();
// 获取类的信息
BeanInfo info = Introspector.getBeanInfo(user.getClass());
// 获取属性的描述
PropertyDescriptor [] pds = info.getPropertyDescriptors();
// 循环遍历,获取属性的名称
for (PropertyDescriptor pd : pds) {
// System.out.println(pd.getName());
if(!"class".equals(pd.getName())){
// 获取写的方法
Method m = pd.getWriteMethod();
m.invoke(user, "admin");
}
}
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}
Beanutils工具包的常用类:
导入jar包,放在WEB-INF–>lib目录下
把字符串转换成日期类型
/** * 字符串转换日期类 * @author Administrator * */
public class MyDateConverter implements Converter{
/** * 字符串转换成日期 */
public Object convert(Class clazz, Object obj) {
// 把输入的字符串,转换成日期类型,返回
String dDate = (String) obj;
// 把字符串转换成日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
date = sdf.parse(dDate);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException("转换日期错误");
}
return date;
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取数据
Map<String, String []> map = request.getParameterMap();
// 创建User对象
User user = new User();
// 完成注册
ConvertUtils.register(new MyDateConverter(), Date.class);
// 完成封装
try {
BeanUtils.populate(user, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
// 打印
System.out.println(user.getUsername());
System.out.println(user.getPassword());
System.out.println(user.getMoney());
System.out.println(user.getBirthday());
}
<%@ page isELIgnored="false" %>
${标识符}
pageContext.findAttribute方法
,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回
(注意,不是null,而是空字符串)。示例:${user}
EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,例如:
${user.address.city}
${user.list[0]}
:访问有序集合某个位置的元素${map.key}
: 获得map集合中指定key的值.
和 [ ]
区别<h4>获取域对象中的值</h4>
<% pageContext.setAttribute("name", "黄海波"); request.setAttribute("name", "美美"); %>
${ pageScope.name }
${ requestScope.name }
<h4>域中数组的值</h4>
<% String [] arrs = {"美美","波波","东东","名名"}; request.setAttribute("arrs", arrs); %>
${ arrs[2] }
<h4>域中集合的值</h4>
<% List<String> list = new ArrayList<String>(); list.add("美美"); list.add("小凤"); list.add("芙蓉"); request.setAttribute("list", list); %>
${ list[1] }
<h4>域中Map集合的值</h4>
<% Map<String,String> map = new HashMap<String,String>(); map.put("aa", "美美"); map.put("bb", "小凤"); request.setAttribute("map", map); %>
${ map.bb }
<h4>域中集合中有对象的值</h4>
<% List<User2> uList = new ArrayList<User2>(); uList.add(new User2("banzhang","123")); uList.add(new User2("美美","abc")); request.setAttribute("uList", uList); %>
${ uList[1].username }
<h4>加法运算</h4> ${ n1 + n2 } <h3>关系运算</h3> <h4>大于</h4> ${ n1 > n2 } 或者 ${ n1 gt n2 } <h4>小于</h4> ${ n1 < n2 } 或者 ${ n1 lt n2 } <h4>等于</h4> ${ n1 == n2 } 或者 ${ n1 eq n2 } <h4>不等于</h4> ${ n1 != n2 } 或者 ${ n1 ne n2 } <h4>大于等于</h4> ${ n1 >= n2 } 或者 ${ n1 ge n2 } <h4>小于等于</h4> ${ n1 <= n2 } 或者 ${ n1 le n2 } <h3>逻辑运算</h3> <h4>与</h4> ${ n1 > n2 && n3 > n4 } 或者 ${ n1 > n2 and n3 > n4 } <h4>或</h4> ${ n1 > n2 || n3 > n4 } 或者 ${ n1 > n2 or n3 > n4 } <h4>非</h4> ${ !(n1 > n2) } 或者 ${ not (n1 > n2) }
${隐式对象名称} :获得对象的引用
pageContext
测试各个隐式对象
-
,例Accept-Encoding
,则要headerValues[“Accept-Encoding”]
${cookie.key}
取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}
或${cookie.key.value}
<h4>EL的WEB对象</h4>
${ param.username }
<h4>获取请求头</h4>
${ header.referer }
<h4>获取全局初始化参数</h4>
${ initParam.username }
<h4>pageContext对象</h4>
${ pageContext.request.contextPath }