javaweb中本身遇到的問題

1.web中的編碼問題

1.1服務器接收的數據

post請求,請求會在Servlet中進行解碼,因此咱們只須要對request設置UTF-8便可。html

request.setCharacterEncoding("UTF-8");

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

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

1.2服務器給瀏覽器發送的數據

可使用以下倆種方法。web

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

注意:必定要在使用以前設置編碼。apache

2.相對路徑和絕對路徑

2.1相對路徑

相對路徑,根據當前的位置爲基準。瀏覽器

2.2重點

通常web項目中的路徑可分爲以下倆種,一種是瀏覽器進行解析,一種是服務器進行解析。
瀏覽器解析 / :表示服務器,服務器進行解析 / 表示服務器下的web應用tomcat

瀏覽器解析:
①在html頁面中的連接,表單提交的地址、引入的文件。
②重定向的地址服務器

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

3靜態引入和動態引入

3.1靜態引入

編譯以前就引入,而後編譯運行app

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

3.2動態引入

編譯以後引入,接着運行jsp

<%--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幫咱們把它的映射路徑配置好了。

在這裏插入圖片描述

相關文章
相關標籤/搜索