工具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域外的文件!這需要類裝載器來讀取。
不多說,自己看點擊打開鏈接
作爲一個初學者,帶着做筆記的想法寫完了這篇博客,所以一定會漏洞百出,歡迎大家糾錯!