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