jsp学习小结
一、jsp声明<%! %>
用于声明变量和方法。似乎不需要定义类就可以直接定义方法,方法似乎可以脱离类独立存在。实际上,JSP声明将会转换成对应Servlet的成员变量或成员方法,因此JSP声明依然符合java语法
<%!
public int count;
public String info(){}
%>
jsp页面会编译成一个Servlet类,每个Servlet在容器中只有一个实例;在jsp中声明的变量是成员变量,成员变量只在创建实例时初始化,该变量值将一直保存,直到实例销毁。
二、输出jsp表达式<%= 表达式%>
输出表达式语法后不能有分号。
三、jsp脚本<% %>
注意,在jsp脚本中声明的变量是局部变量。不能使用private、public等访问控制符修饰,也不可使用static修饰。实际上jsp页面里脚本部分以及静态内容都由sevlet实例的_jspService方法里输出语句来输出。由于jsp脚本将转换成_jspService方法里的可执行性代码,而java语法不允许在方法里定义方法,所以jsp脚本里不能定义方法。
四、jsp的三个编译指令page,include,taglib
(1)page指令通常位于jsp页面的顶端,一个jsp页面可以使用多条page指令。
<%@page
language=""
extends="" //jsp页面编译产生的java类所继承的父类或实现的接口
import="" //用来导入包
session="" //是否需要HTTP Session
contentType="text/html;charSet=utf-9" //用于设定生成网页的文件格式和编码字符集
%>
(2)include指令
使用include指令,可以将一个外部文件嵌入到当前的jsp文件中,同时解析这个页面的jsp语句。
(3)taglib 用于定义和访问自定义标签
五、jsp的7个动作指令
(1)jsp:forward //执行页面转向,将请求的处理转发到下一个页面。
(2)jsp:param //用于传递参数,必须与其他支持参数的标签一起使用。
(3)jsp:include //用于动态引入一个jsp页面。
(4)jsp:plugin //用于下载javaBean或Applet到客户端执行。
(5)jsp:useBean //创建一个javaBean的实例。
(6)jsp:setProperty //设置javaBean实例的属性值。
(7)jsp:getPropert //输出javaBean实例的属性值。
<jsp:param name="paramName" vlaue="paramValue"/>
<jsp:useBean id="name" class="classname" scope="page|request|session|application" />
<jsp:setProperty name="BeanName" proterty="propertyName" value="value"/>
<jsp:getProperty name="BeanName" proterty="propertyName" />
六、jsp脚本包含9个内置对象.
这9个内置对象都是Servlet API接口的实例,只是jsp规范对它们进行了默认初始化(由jsp页面对应的Servlet的_jspService()方法来创建这些实例)。也就是说,他们已经是对象,可以直接使用。9个内置对象依次如下:
(1)application
javax.servlet.ServetContext的实例。该实例代表jsp所属的web应用本身,可用于jsp页面,或者Servlet之间交换信息。常用的方法有getAttribute(String attName),setAttribute(String attName,String attValue)和getInitParameter(String paramName)等。
(2)config
javax.servlet.ServletConfig的实例,该实例代表jsp的配置信息。常见方法有getInitParameter(String paramName)和getInitParameternames()等方法。
(3)exception
java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。只有当编译指令page的isErrorPage属性为true时,给对象才可以使用。
(4)out
javax.servlet.jsp.JspWriter的实例,该实例代表jsp页面的输出流,用于输出内容,形成HTML页面。
(5)page
代表页面本身,通常没有太大用处,也就是Servlet中的this。
(6)pageContext
javax.servlet.jsp.PageContext 的实例,该对象代表jsp页面上下文,使用该对象可以访问页面中的共享数据。常用的方法有getServletContext()和getServletConfig()等。
(7)request
javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都封装在该对象里。这是一个常用对象,获取客户端请求参数必须使用该对象。
常用方法有getParameter(String paramName) , getParameterValues(String paramName) ,setAttribute(String attrName, 0bject attrValue) , getAttribute(String attrName)和setCharacterEncoding(String env, getRequdstDispatcher(String path).foward //请求转发 )等。
(8)rssponse
javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。通常很少使用给对象直接响应,而是使用out对象,除非需要生产非字符响应。response对象常用于重定向,常用的方法有getOutputStream() , sendRedirect(java.lang.String.location) //重定向, addCookie(Cookie c) // 增加cookie
(9)session
javax.servlet.http.HttpSession 的实例,该对象代表一次对话。常用方法有getAttribute(String attrName) , setAttribute(String attrName,Object attrValue)等。
七、编码技巧
(1)如果POST请求的请求参数里包含非西欧字符,则必须在获取请求参数之前调用setCharacterEncoding()方法设置编码的字符集。比如,如果发送请求的表单采用gb2312字符集,该表单页发送的请求也采用gb2312字符集,所以必须执行方法:setCharacterEncoding("gb2312"); //设置request编码所使用的字符集。
(2)如果get方式请求值里包含了非西欧字符,则用setCharracterEncoding();无效,应借助于java.net.URLDecoder类。
String rawQueryStr = request.getQueryString(); //获取请求里包含的查询字符串
String queryStr = java.net.URLDecoder.decode(rawQueryStr,"gbk"); //使用URLDecoder解码字符串
(3)如果你不想按(2)的做,还可以在获取请求参数值之后对请求参数值重新编码。也就是先将其转换成字节数组,再将字节数组重新编码成字符串。例如:
String rawName = request.getParameter("name");
byte[] rawBytes = rawName.getByte("ISO-8859-1"); //将请求参数使用ISO-8859-1字符串分解成字节数组。
String name = new String(rawBytes,"gb2312"); //将字节数组重新编码成字符串
(4)默认情况下,Cookie值不允许出现中午字符,如果我们需要值为中午内容的cookie,就同样可以借助于java.net.URLEncoder先对中午字符串进行编码,将编码后的结果设为cookie值,当程序要读取cookie时,则应先读取,然后用java.net.URLDecoder对其进行编码。
Cookie c = new Cookie("cnName" ,"java.netURLEncode.encode("孙悟空", "gbk"); //以编码后的字符串为值,创建一个Cookie对象
response.addCookie(c);
Cookie[] cookie = request.qetCookie();
out.println(java.net.URLDecoder.decode(cookie[1].getValue()); //使用URLDecode对cookie值进行解码