1. JSP的4种基本语法
1.1 JSP注释
<%-- 注释内容 --%>
1.2 JSP声明
<%! 声明部分 %> 声明变量和方法
例如:
1 <%! 2 3 Public int count; 4 5 Public String info() 6 7 { 8 9 Return “hello”; 10 11 } 12 13 %>
声明的变量和方法会变为Servlet类的成员变量和方法,可以用public、private等访问修饰符修饰,也可用static修饰。
1.3 输出JSP表达式
<%= 表达式 %>
例如:<%=info()%>
1.4 JSP脚本
<% JAVA代码 %>
JSP脚本将转换为Servlet里_jspService方法的可执行代码,这意味着jsp脚本部分可以声明变量,但这是局部变量,不可用访问修饰符修饰。
2. JSP的3个编译指令
JSP的编译指令是通知JSP引擎的消息,它不直接生成输出。
编译指令的语法格式:<%@ 编译指令名 属性名=”属性值” …. %>
2.1 Page指令
Page指令属性:
Language:默认为java
Extends:指定jsp页面编译产生的Java类所继承的父类或所实现的接口
Import:用来导入包。默认导入的包有java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*。
Session: 设定该页面是否需要session
Buffer:指定输出缓冲区的大小
Info:设置该jsp程序的信息
ErrorPage: 指定错误页面
isErrorPage:设置本JSP页面是否为错误处理程序
contentType:设置网页格式和编码
pageEncoding:指定生成网页的编码字符集
2.2 Include指令
<%@ include file=”script.jsp” %>
3. JSP的7个动作指令
3.1 Jsp:forward
Forward指令用于将页面响应转发到另外的页面或servlet中,转发是可以增加额外的参数,参数可以在目标页面中用HttpServletRequest类的getParameter()方法获取。
命令语法:
1 <jsp:forward page=”{relativeURL | <%=expression%}” /> 2 <jsp:param name=”” value=”” /> 3 </jsp:forward>
例如:
1 <jsp:forward page=”result.jsp”> 2 <jsp:param name=”age” value=”29” /> 3 </jsp:forward>
1 <h3>目标页面</h3> 2 <%=request.getParameter(“age”)%>
3.2 Jsp:include
用于包含某个页面,它不会导入被include页面的编译指令,仅将页面的body内容插入页面。
语法格式:
1 <jsp:include page=”{relativeURL | <%=expression%}” flush=”true”> 2 <jsp:param name=”” value=”” /> 3 </jsp:include>
3.3 Jsp:useBean jsp:setProperty jsp:getProperty
useBean指令用于在jsp页面中初始化一个Java实例。setProperty设置JavaBean的属性值,getProperty输出JavaBean的属性值。
语法格式:
1 <jsp:useBean id=”” class=”” scope=”page | request | session | application” /> //id是JavaBean的实例名 2 <jsp:setProperty name=”” property=”” value=”” /> //name是JavaBean的实例名 3 <jsp:getProperty name=”” property=”” />
3.4 Jsp:plugin
主要用于下载服务器端的JavaBean或Applet到客户端执行
3.5 Jsp:param
用于设置参数,不能单独使用,需和include、forward或plugin一起使用。
4. JSP中的9个内置对象
- application:javax.servlet.ServletContext的实例,代表JSP所属的应用本身。常用方法有getAttribute()、setAttribu()和getInitParameter()
- config:javax.servlet.ServletConfig的实例,代表该JSP的配置信息。常用方法有getInitParameter()和getInitParameternames()
- exception :java.lang.Throwable的实例,只有当编译指令page的isErrorPage属性为true时该对象才可以使用。常用方法有getMessage()和printStackTrace()
- out:javax.servlet.jsp.JspWriter的实例,代表JSP页面的输出流
- page:代表页面本身,也就是servlet中的this,能用page的地方就可以用this
- pageContext:javax.servlet.jsp.PageContext的实例,代表JSP页面上下文,使用该对象可以访问页面中的共享数据。常用方法有getServletContext()和getServletConfig()等
- request:javax.servlet.http.HttpServletRequest的实例,获取客户端请求参数必须使用该对象。常用方法有getParameter()、getParameterValues()、setAttribute()和getAttribute等
- response :javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应。常用方法有getOutputStream()、sendRedirect()等
- session :javax.servlet.http.HttpSession的实例,代表依次会话,客户端浏览器与站点建立连接时会话开始,客户端关闭浏览器时,会话结束
JSP内置对象都是在_jspService 方法中完成初始化,因此只能在JSP脚本、JSP输出表达式中使用这些内置对象,而不能再JSP声明中使用它们。
4.1 Application对象
application对象通常有两个作用:
1) 在整个web应用的多个JSP、Servlet之间共享数据
2) 访问web应用的配置参数
4.1.1 让多个JSP、Servlet共享参数
1 //get-application.jsp
2 <% ! 3 int i ; 4 %> 5 <% 6 application.setAttribute(‘counter’, String.valueof(++i)) ; 7 %>
1 //put-application.jsp
2 <%=application.getAttribute(‘counter’);%>
1 //Servlet
2 @WebServlet(name=”get-application”, urlPatterns=(“get-application”)) 3 public class getApplication extends httpServlet { 4 public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { 5 response.setContextType(“text/html;character=gb2312”); 6 PrintWriter out = response.getWriter(); 7 out.println(“<html><head><title>”); 8 out.println(“测试application”); 9 out.println(“</title></head><body>”); 10 ServletContext sc = getServletConfig.getServletContext(); 11 out.println(“application中当前的counter值为:”); 12 out.println(sc.getAttribute(“counter”)); 13 out.println(“</body></html>”); 14 } 15 }
4.1.2 获得web应用配置参数
1 //getWebParam.jsp 2 <% 3 String driver = application.getInitParameter(“driver”); 4 String url = application.getInitParameter(“url”); 5 String user = application.getInitParameter(“user”); 6 String password = application.getInitParameter(“password”); 7 %>
4.2 Config对象
1 //config.jsp 2 3 name配置参数的值为:<%=config.getInitParameter(“name”)%>
1 //web.xml 2 3 <servlet> 4 <servlet-name>config</servlet-name> 5 <jsp-file>/config.jsp</jsp-file> 6 <init-param> 7 <param-name>name</param-name> 8 <param-value>juedi</param-value> 9 </init-param> 10 <servlet-mapping> 11 <servlet-name>config</servlet-name> 12 <url-pattern>/config</url-pattern> 13 </servlet-mapping>
4.3 Exception对象
在JSP的异常处理机制中,一个异常处理页面可以处理多个JSP页面脚本部分的异常。异常处理页面通过page指令的errorPage属性指定。
1 //throwException.jsp 2 3 <%@ page errorPage=”error.jsp”%> 4 <% 5 int a = 6; 6 int c = a / 0; 7 %>
1 //error.jsp 2 3 <%@ page isErrorPage=”true”%> 4 <body> 5 异常类型是:<%=exception.getClass()%><br /> 6 异常信息是:<%=exception.getMessage()%> 7 </body>
4.4 Out对象
所有用out的地方,都可以用输出表达式来代替。<%=……%>表达式的本质就是out.write()。
4.5 pageContext对象
该对象主要用于访问JSP之间的共享数据,可以访问page、request、session、application范围的变量,可以用pageContext.getAttribute(name, scope)来得到任意作用域的属性值。
1 //pageContextTest.jsp 2 3 <% 4 pageContext.setAttribute(“page”, “hello”); 5 pageContext.setAttribute(‘name’, ‘juedi’ , pageContext.SESSION_SCOPE) ; 6 pageContext.setAttribute(‘pass’, ‘pass’, pageContext.APPLICATION_SCOPE) ; 7 %>
pageContext还可以获得其他对象:
ServletRequest getRequest()
ServletResponse getResponse()
ServletConfig getServletConfig()
ServletContext getServletContext()
HttpSession getSession()
4.6 Request对象
4.6.1 获取请求头/请求参数
请求头由浏览器自动添加,请求参数由客户指定。
获取请求头的方法:
String getHeader():获取指定请求头的值
java.util.Enumeration<String> getHeaderNames():获取所有请求头的名称
java.util.Enumeration<String> getHeaders():获取指定请求头的多个值
int getIntHeader():获取指定请求头的值并转换为整数
获取请求参数的方法:
String getParameter() :获取指定名字的参数的值
Map getParameterMap():获取参数名和值构成的Map对象
Enumeration getParameterNames():获取所有请求参数名构成的enumeration对象
String[] getParameterValues() :获取指定名字的参数的值
1 //request.jsp 2 3 <% 4 Enumeration<String> headerNames = request.getHeaderNames() ; 5 while (headerNames.hasMoreElements()) 6 { 7 String headerName = headerNames.nextElement(); 8 out.println(headerName + “-->” + request.getHeader(headerName) + “<br />”); 9 } 10 String name = request.getParameter(“name”); 11 %> 12
4.6.2 操作request范围的属性
1 //draw.jsp 2 3 <body> 4 <form method=”post” action=”first.jsp”> 5 取钱:<input type=”text” name=”balance” /> 6 <input type=’submit’ value=’submit’ /> 7 </form> 8 </body> 9
1 //first.jsp 2 3 <% 4 String bal = request.getParameter(“balance”); 5 double qian = Double.parseDouble(bal); 6 if (qian < 500) 7 out.println(‘Give you’ + qian); 8 else 9 { 10 List<String> info = new ArrayList<String>(); 11 info.add(“1111”); 12 info.add(“2222”); 13 request.setAttribute(“info”, info); 14 } 15 %> 16 <jsp :forward page= ‘second.jsp’ /> 17
1 //second.jsp 2 3 <% 4 String bal = request.getParameter(‘balance’) ; 5 double qian = Double.parseDouble(bal); 6 List<String> info = (List<String>)request.getAttribute(‘info’) ; 7 for (String tmp : info) 8 out.println(tmp + “<br />”); 9 out.println(“Give you” + qian); 10 %>
forward用户请求时,请求参数和request范围的参数都不会丢失,即forward后还是原来的请求,未再次向服务器发送请求。
4.6.3 执行forward或include
HttpServletRequest类提供了一个getRequestDispatcher(String path)方法,其中path是希望forward或include的路径,该方法返回一个RequestDispacher。
getRequestDispatcher(“a.jsp”).include(request, response)
4.7 Response对象
4.7.1 response生成非字符响应
out对象也可以生成响应,但out是JSPWriter的实例,JSPWriter是Writer的子类,Writer是字符流,无法生成非字符内容。