JavaWeb学习总结——JavaWEB_JSP(尚硅谷_佟刚老师)

时间:2021-01-10 13:10:05

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(HttpServletRequestrequest, HttpServletResponseresponse) 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 对应的 ServletServletConfig对象(几乎不使用).若需要访问当前 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(request,response);

重定向

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);

    %>