javaweb中自己遇到的問題

pavi發表於2020-08-27

1.web中的編碼問題

1.1伺服器接收的資料

post請求,請求會在Servlet中進行解碼,所以我們只需要對request設定UTF-8即可。

request.setCharacterEncoding("UTF-8");

get請求,改請求會在Tomcat中進行解碼,所以我們需要在tomcat安裝位置的conf目錄下的server.xml中,按照下所示修改。

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true" URIEncoding="utf-8"/>

1.2伺服器給瀏覽器傳送的資料

可以使用如下倆種方法。

// 1 設定響應頭
response.setHeader("Content-Type","text/html;charset=utf-8");
//2 設定響應型別
response.setContentType("text/html;charset=utf-8");

注意:一定要在使用之前設定編碼。

2.相對路徑和絕對路徑

2.1相對路徑

相對路徑,根據當前的位置為基準。

2.2重點

一般web專案中的路徑可分為如下倆種,一種是瀏覽器進行解析,一種是伺服器進行解析。
瀏覽器解析 / :表示伺服器,伺服器進行解析 / 表示伺服器下的web應用

瀏覽器解析:
①在html頁面中的連結,表單提交的地址、引入的檔案。
②重定向的地址

伺服器解析:
①Servlet請求的地址,Filter攔截的地址等
②轉發的地址

3靜態引入和動態引入

3.1靜態引入

編譯之前就引入,然後編譯執行

<%--jsp指令--%>
<%@include file="bb.jsp" %>

3.2動態引入

編譯之後引入,接著執行

<%--jsp動作標籤--%>
<jsp:include page="/cc.jsp"></jsp:include>

4jsp基本原理

4.1初步

​ jsp為啥可以執行java程式碼,其實它是把jsp中寫的程式碼轉為Servlet。

4.2步驟

①首先我把自己寫的一個動態web專案部署到tomcat中。
在這裡插入圖片描述

②啟動tomcat,在cmd下catalina start或者startup

③在D:\developer\apache-tomcat-8.5.24\work\Catalina\localhost\stu-web\org\apache\jsp目錄下看到如下圖所示。
在這裡插入圖片描述

④開啟aa_jsp.class,這裡我猜測這和專案中的jsp的檔名非常類似,於是猜測這應該就是aa.jsp轉為的Servlet

public final class aa_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports 

根據如上程式碼,我們看到它繼承HttpJspBase,而HttpJspBase又繼承HttpServlet,所以可以說這就是Servlet.
在這裡插入圖片描述

⑤那麼它又是如何把html程式碼指令碼片段、表示式以及宣告等進行轉換,我們可以看如下程式碼。
在這裡插入圖片描述

//宣告
private int num  =1000;
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;
	// html程式碼
      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write("    ");
      out.write("\r\n");
      out.write("    ");
	 //指令碼片段
      int a = 100;
      System.out.println("1111");
      out.write("    ");
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/cc.jsp", out, false);
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
  }

我們可以得出它把html程式碼輸出到頁面中;指令碼片段把,<%%>去掉,中間的程式碼直接寫到相應的位置;宣告若為屬性,則它該類中書寫屬性,若為方法,則它在該類中編寫方法。

⑥另外tomcat幫我們把它的對映路徑配置好了。

在這裡插入圖片描述

相關文章