J2EE關於Servlet的代碼知識整理!

工具intellij,推薦使用。作爲一個jetbrains的鐵忠粉,能用上的我幾乎都下載了,而且學生認證很簡單,次日就可用認證完成。

1.首先用intellij先新建一個project:


然後再src中新建一個servlet,代碼:

package util;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "MySer")
public class MySer extends HttpServlet {
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");out.print("    This is ");
        out.print(this.getClass());out.println(", using the GET method");
        out.println("  </BODY>");out.println("</HTML>");out.flush();out.close();
    }

    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
}

然後再在../web/WEB-INFO/web.xml中對Servlet進行註冊:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>MySer</servlet-name>
        <servlet-class>util.MySer</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MySer</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
servlet-name即Servlet的名字,servlet-class可以寫 包名.類名格式,沒有包就可以不寫,url-pattern在瀏覽器中訪問時作爲訪問Servlet的地址後綴,可寫多個
比如這裏的是/hello,那麼訪問時就是http://localhost:8080/項目名/hello,即可訪問到Servlet。

然後再index.jsp文件中對servlet提交請求即可,代碼:

<body>
    <form action="/hello" method="post">
       <input type="submit" value="提交">
    </form>
  </body>

登錄



2.通過ServletConfig獲取Servlet的初始化參數

如果給Servlet配置了初始化函數的話,tomcat會在創建一個Servlet對象時將初始化參數封裝進一個ServletConfig裏並通過Servlet中的init()方法傳進去

在web.xml中Servlet中加上

<servlet>
        <servlet-name>MySer</servlet-name>
        <servlet-class>util.MySer</servlet-class>
        <init-param>
            <param-name>name</param-name>
            <param-value>hsw</param-value>
        </init-param>
        <init-param>
            <param-name>id</param-name>
            <param-value>987654321</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456789</param-value>
        </init-param>
    </servlet>

然後就可以在Servlet獲取即可:

public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("UTF-8");
        PrintWriter out = response.getWriter();

        Enumeration<String> names = config.getInitParameterNames();

        while (names.hasMoreElements()) {
            String name = names.nextElement();
            out.println(name + ": " + config.getInitParameter(name));
        }

    }

3.ServletContext對象

web容器啓動時會給每個web程序創建一個ServletContext對象,其代表的即是當前的web應用。

web在ServletConfig中維護了ServletContext對象,可以通過ServletConfig.getServletContext()獲取該對象,也能用this.getServletContext()。

因爲一個web應用中所有Servlet共享一個ServletContext,所以ServletCopntext可以通過ServletContext實現通信。

創建一個新的Servlet MySer2,doPost代碼攜程這個樣子

public class MySer2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = (String) context.getAttribute("name");
        PrintWriter printWriter = response.getWriter();
        printWriter.println("this is Servlet2");
        printWriter.println("name" + " :" + name  + "from MySer2");
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

把MySer裏未用到的doGet函數作爲設定一個屬性的方法!

public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ServletContext context = config.getServletContext();
        context.setAttribute("name", "何少文");

        response.setContentType("UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
        out.println("<HTML>");
        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
        out.println("  <BODY>");
        out.println("this is Servlet1");
        out.println("   <form action=\"/hello2\" method=\"post\">");
        out.println("   <input type=\"submit\" value=\"提交\">");
        out.println("   </form>");
        out.println("  </BODY>");
        out.println("</HTML>");
        out.flush();
        out.close();
    }
web代碼添加
<servlet>
        <servlet-name>MySer2</servlet-name>
        <servlet-class>util.MySer2</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MySer2</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

運行下程序:


顯示index.jap的內容!

點提交,將註冊表接入MyServlet,然後就有了MySer中輸出的xml代碼。


點擊此處的submit


就顯示了MySer2的內容,這裏從ServletConfig獲取到了MySer中添加的name屬性。

4.獲取WEB應用的初始化參數:

在web.xml中web-app中添加

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" >
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/test</param-value>
    </context-param>
</web-app>

然後再Servlet中直接ServletContext.getInitParameter(String name)即可!類似於ServletConfig.getInitParameter(String name);不多贅述。

5.用ServletContext進行請求轉發

上課時老師曾拿請假作爲例子,拿假條去財務部沒用,然後財務部直接吧假條轉到學工處理。

這裏即某個Servlet處理不了的問題,運用ServletContext請求轉發將其轉到其他的Servlet處理。看代碼。

新建兩個類,MySer3,MySer4:

public class MySer4 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("這是MySer4!");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

public class MySer3 extends HttpServlet {

    ServletConfig config = null;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       
        ServletContext context = config.getServletContext();
        RequestDispatcher dispatcher = context.getRequestDispatcher("/hello4");//這裏還是和表單form中action填的是一樣的!並不是類名
        dispatcher.forward(request, response);

    }

    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
運行:


點擊提交:


5.利用ServletContext獲取讀取資源文件

根據資源文件的位置的不同,讀取的方式也有不同。可以大致的分爲兩類:

1.在Servlet的context域中讀取。2.在非Servlet中讀取文件,需要使用類加載器加載!

可以看到下面的java項目的目錄結構可以看出,class有兩個輸出位置,根據以往java的項目文件格式,可以知道production文件夾下是java的class輸出位置  。而針對web程序,工程目錄下的src目錄被髮布到服務器時會映射到/WEB-INF/classes,所以這裏可以忽視peoduction的存在,只用WEB-INFO的目錄就行(production沒試過

創建幾個properties文件

.properties的格式差不多這樣


新建MySer5:

public class MySer5 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        getPro(response);
        response.getWriter().println("<hr/>");
        getPro2(response);
        response.getWriter().println("<hr/>");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    private void getPro(HttpServletResponse response) throws IOException {
        //InputStream input = new FileInputStream(new File("/WEB-INF/classes/util/pro.properties"));//這樣沒用,一定要用下面的語句!
        InputStream input = this.getServletContext().getResourceAsStream("/WEB-INF/classes/util/pro.properties");
        Properties pro = new Properties();
        pro.load(input);
        String name = pro.getProperty("name");
        String admin = pro.getProperty("admin");
        String password = pro.getProperty("password");
        PrintWriter out = response.getWriter();
        out.println("information come from pro1: ");
        out.println("name : " + name + ", admin :" + admin + ", password :" + password);
    }

    private void getPro2(HttpServletResponse response) throws IOException {
//這樣根本沒用:InputStream input = new FileInputStream(new File("/out/artifacts/firstServlet_war_exploded/pro2.properties"));
        InputStream input = this.getServletContext().getResourceAsStream("/pro2.properties");
        Properties pro = new Properties();
        pro.load(input);
        String name = pro.getProperty("name");
        String admin = pro.getProperty("admin");
        String password = pro.getProperty("password");
        PrintWriter out = response.getWriter();
        out.println("information come from pro2\n");
        out.println("name : " + name + ", admin :" + admin + ", password :" + password);
    }
}

在web中寫下Servlet信息。修改表單中的url爲/hello5:

運行結果:


目錄結構中可以看出web目錄下和映射文件夾裏面的內容大致相似。

所以根據以上代碼即可推導出所有在ServletContext域中的所有配置文件的路徑。

然後就是非Servlet域外的文件!這需要類裝載器來讀取。

不多說,自己看點擊打開鏈接

作爲一個初學者,帶着做筆記的想法寫完了這篇博客,所以一定會漏洞百出,歡迎大家糾錯!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章