jsp

本文详细介绍了JSP的基础知识,包括为什么使用JSP,Hello World示例,JSP的存放位置,JSP运行原理,以及9个隐含对象。还讲解了JSP指令,如page指令的常用属性,请求转发和重定向的本质区别,以及include指令和jsp:include标签的静态与动态引入。同时,文章涵盖了JSP处理中文乱码的方法和注意事项。

1. JSP:

1). WHY:

JSP 是简Servlet 编写的一种技术,

JSP = Java(动态) + HTML(静态页面)

2). Java ServerPage: Java 服务器端网页 HTML 页面中编写 Java 代码的页面.jsp

2). helloworld:

新建一个 JSP 页面 body 节点内的 <%%> 即可编写 Java 代码.

<body>

         <%

                  Date date = new Date();

                   System.out.print(date);

         %>

</body>

3). JSP 可以放置在 WEB 应用程序中的除了 WEB-INF 及其子目录外的其他任何目录中,JSP 页面的访问路径与普通 HTML 页面的访问路径形式也完全一样。

4). JSP的运行原理: JSP 本质上是一个 Servlet.

每个JSP 页面在第一次被访问时, JSP 引擎将它翻译成一个 Servlet 源程序接着再把这个 Servlet 源程序编译成 Servlet  class 类文件.然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。

5). JSP 页面的隐含变量没有声明就可以使用的对象. JSP页面一共有 9 个隐含对象.

public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException {

    PageContext pageContext= null;

    HttpSession session= null;

    ServletContext application= null;

    ServletConfig config= null;

    JspWriter out= null;

    Object page= this;

      //使用  <% %> 编写的代码在此位置可以用到这 8 个隐含对象.

//(实际上还可以使用一个叫 exception 的隐含对象)

}

  request:HttpServletRequest 的一个对象. *

String name = request.getParameter(“name”);

System.out.println(name);

(GET方法测试)http://localhost:8080/MYtest1/hello.jsp?name=guigu21

response:HttpServletResponse 的一个对象

( JSP 页面中几乎不会调用 response 的任何方法.)

pageContext:页面的上下文 PageContext 的一个对象可以从该对象中获取到其他 8 个隐含对象也可以从中获取到当前页面的其他信息. (学习自定义标签时使用它) *

session:代表浏览器和服务器的一次会话 HttpSession 的一个对象后面详细学习. *

application:代表当前 WEB 应用ServletContext 对象. *

config:当前 JSP 对应的 Servlet ServletConfig 对象(几乎不使用). 若需要访问当前 JSP 配置的初始化参数,需要通过映射的地址才可以。

映射 JSP:

<servlet>

    <servlet-name>hellojsp</servlet-name>

    <jsp-file>/hello.jsp</jsp-file>

    <init-param>

           <param-name>test</param-name>

           <param-value>testValue</param-value>

    </init-param>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>hellojsp</servlet-name>

      <url-pattern>/hellojsp</url-pattern>        

  </servlet-mapping>

out:JspWriter 对象调用out.println() 可以直接把字符串打印到浏览器上. *

换行方式:加<br>或者out.println(“<br><br>”);

page:指向当前 JSP 对应的 Servlet 对象的引用但为 Object 类型只能调用 Object 类的方法(几乎不使用)

exception:在声明了 page 指令的 isErrorPage="true" 才可以使用. *

<%@ page isErrorPage="true" %>

pageContext, request, session, application(对属性的作用域的范围从小到大)

out, response, config, page

exception

6). JSP模版元素(HTML

JSP页面中的静态HTML内容称

7). JSP表达式<%=  %>

提供了将一个 java 变量或表达式的计算结果输出到客户端的简化方式,

它将要输出的变量或表达式直接封装在<%=  %>之中。

<%

         Date date = new Date();

         out.print(date);                ——>(与下述JSP表达式效果源码均相同)

%>

<%= date %>

8). JSP脚本片断<%  %>

指嵌套在<%  %>之间的一条或多条Java程序代码。

多个脚本片断中的代码可以相互访问

<%

         String ageStr = request.getParameter("age");

      Integer age = Integer.parseInt(ageStr);

             if(age >= 18){

%>

             成人...

<%

      }else{

%>

             未成人...

<%

      }

%>

9). JSP 声明<%!方法%>

JSP 声明将 Java 代码封装在<%!和 %>之中,它里面的代码将被插入进 Servle t _jspService 方法的外面

将方法卸载<%!   %>之中

( JSP 页面中几乎从不这样使用)

10). JSP注释的格式:

<%-- JSP 注释 --%>

   <!-- HTML 注释 -->

区别: JSP 注释中的 Java 代码的不能执行.

 

2. 和属性相关的方法:

1). 方法

void setAttribute(String name, Object o):

设置属性

Object getAttribute(String name):

获取指定的属性

Enumeration getAttributeNames():

获取所有的属性的名字成Enumeration 对象

removeAttribute(String name):

移除指定的属性

2). pageContext, request,session, application 对象都有这些方法!

这四个对象也称之为域对象.

pageContext

仅限于当前 JSP 页面

request

仅限于同一个请求(时间测试-----代码中的Date)

<a href =”attr_2.jsp”>  TO Attr2 Page  </a>

再转发的情况下可以跨页面获取属性值

session

限于一次会话: 浏览器打开直到关闭称之为一次会话

(在此期间会话不失效)

application

限于当前 WEB 应用. 是范围最大的属性作用范围, 只要在一处设置属性, 在其他各处的 JSP 或 Servlet 中都可以获取到

 

3. 请求的转发和重定向:

1). 本质区别:

请求的转发只发出了一次请求,

重定向则发出了两次请求.

转发

String path = "testServlet";

RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);

requestDispatcher.forward(requestresponse);

重定向

String path = "testServlet";

response.sendRedirect(path);

具体:

请求的转发地址栏是初次发出请求的地址.

重定向地址栏不再是初次发出的请求地址地址栏为最后响应的那个地址

请求转发在最终的 Servlet , request 对象和中转的那个 request 是同一个对象.

请求的重定向在最终的 Servlet , request 对象和中转的那个 request 不是同一个对象.      

请求转发

的代码

request.getRequestDispatcher("/c.jsp").forward(request, response);

请求的重定向

response.sendRedirect("/c.jsp");

请求的转发只能转发给当前 WEB 应用的的资源

       请求的重定向可以重定向到任何资源.

请求的转发: /代表的是当前 WEB 应用的根目录

       请求的重定向: /代表的是当前 WEB 站点的根目录.

 

       转发:例如在attr_1中添加转发代码,

<%

       request.getRequestDispatcher("attr_2.jsp").forward(request, response);

    %>

重定向可以定到任何资源

response.sendRedirect(“http://www.baidu.com”)

4. JSP 指令:

 JSP指令(directive)是为JSP引擎而设计的它们并不直接产生任何可见输出而只是告诉引擎如何处理JSP页面中的其余部分。

在目前的JSP 2.0中,定义了page、include  taglib这三种指令

5. page 指令:

1). page指令用于定义JSP页面的各种属性,作用的都是整个JSP页面,通常在JSP页面的起始位置。

2). page 指令常用的属性:

. import 属性指定当前 JSP 页面对应的 Servlet需要导入的类.

<%@pageimport="java.text.DateFormat"%>

session属性取值为 true  false, 指定当前页面的session 隐藏变量是否可用也可以说访问当前页面时是否一定要生成 HttpSession对象.

<%@ pagesession="false" %>

 

. errorPage  isErrorPage:

      >errorPage 指定若当前页面出现错误的实际响应页面时什么.

      <%@ page errorPage="/error.jsp" %> WEB 应用根目录.

      在响应 error.jsp, JSP 引擎使用的请求转发的方式.

      >isErrorPage 指定当前页面是否为错误处理页面,可以说明当前页面是否可以使用 exception 隐藏变量需要注意的是若指定  isErrorPage="true",并使用 exception 的方法了一般不建议能够直接访问该页面.

      > 如何使客户不能直接访问某一个页面呢 ?

对于 Tomcat 服务器而言WEB-INF下的文件是不能通过在浏览器中直接输入地址的方式来访问的但通过请求的转发是可以的!   

      > 还可以在 web.xml 文件中配置错误页面:

      <error-page>

    <!-- 指定出错的代码: 404 没有指定的资源, 500 内部错误. -->

           <error-code>404</error-code>

           <!-- 指定响应页面的位置 -->

           <location>/WEB-INF/error.jsp</location>

      </error-page>

      <error-page>

           <!-- 指定异常的类型 -->

           <exception-type>java.lang.ArithmeticException</exception-type>

           <location>/WEB-INF/error.jsp</location>

      </error-page>

contentType:指定当前 JSP 页面的响应类型.

实际调用的是response.setContentType("text/html; charset=UTF-8");

通常情况下对于 JSP 页面而言其取值均为 text/html; charset=UTF-8.charset 指定返回的页面的字符编码是什么通常取值为 UTF-8

. pageEncoding: 指定当前 JSP 页面的字符编码通常情况下该值和contentType 中的 charset 一致.

. isELIgnored: 指定当前 JSP 页面是否可以使用 EL 表达式.

通常取值为 false.

6. include 指令:——静态引入

1). <%@ include file="b.jsp"%>

include 指令用于通知 JSP 引擎在翻译当前 JSP 页面时将其他文件中的内容合并进当前 JSP 页面转换成的 Servlet 源文件中,

这种在源文件级别进行引入的方式称之为静态引入当前JSP页面与静态引入的页面紧密结合为一个Servlet

2). file属性的设置值必须使用相对路径

3). 如果 / 开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件

7. jsp:incluce 标签:——动态引入

1). <jsp:includepage="b.jsp"></jsp:include>

2). 动态引入并不是像 include 指令生成一个 Servlet 源文件而是生成两个 Servlet 源文件然后通过一个方法的方式把目标页面包含进来.

org.apache.jasper.runtime.JspRuntimeLibrary.include(request,response, "b.jsp", out, false);

8. jsp:forward:

1).<jsp:forward page="/include/b.jsp"></jsp:forward>

相当于.

<%

      request.getRequestDispatcher("/include/b.jsp").forward(request,response);

%>

2). 与转发的区别

但使用 jsp:forward可以使用 jsp:param 子标签向 b.jsp 传入一些参数同样jsp:include也可以使用 jsp:param 子标签.

<jsp:forward page="/include/b.jsp">

      <jsp:param value="abcd" name="username"/>

</jsp:forward>  

<jsp:include page="/include/b.jsp">

      <jsp:param value="abcd" name="username"/>

</jsp:include>

b.jsp中调用request.getParameter("username")获取到传入的请求参数.

9. 关于中文乱码:

1).显示

contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"

浏览器的显示的字符编码

2). 获取中文参数值默认参数在传输过程中使用的编码为 ISO-8859-1

对于 POST 请求只要在获取请求信息之前

(在调用 request.getParameter 或者是 request.getReader),

调用request.setCharacterEncoding("UTF-8") 即可.

对于 GET 请求前面的方式对于 GET 无效可以通过修改 Tomcat  server.xml 文件的方式.

 Connector 节点添加 u seBodyEncodingForURI="true" 属性即可.(工程文件的server文件(映射)也务必也得修改)

<ConnectorconnectionTimeout="20000" port="8989"protocol="HTTP/1.1" redirectPort="8443"useBodyEncodingForURI="true"/>

    或者手动解码再编码

<%

    String val = request.getParameter("user");

    String userName = new String(val.getBytes("iso-8859-1"),"UTF-8");

    out.print(userName);

    %>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值