java EE開發之Servlet第二課:Servlet的三個hashMap

新夢想IT發表於2022-07-29


 

1,第一個hashMap:如何解決編碼問題 (相當於過濾器)

解決因提交方式不同的引數編碼問題

 

resp.setContentType("text/html;charset=utf-8");

PrintWriter out=resp.getWriter();

String method=req.getMethod();

if("post".equalsIgnoreCase(method)){

req.setCharacterEncoding("utf-8");

}else if("get".equalsIgnoreCase(method)){

//得到一個引數的hashMap集合(req.getParameterNames())

Map map=req.getParameterMap();

Set setmap=map.keySet();  

//再進行迭代  

Iterator it=setmap.iterator();

 //將迭代迴圈

while(it.hasNext()){      

//取得迭代中的鍵   

String key=(String)it.next(); 

 //透過鍵取值

String[] values=(String[])map.get(key);

for(int i=0;i<values.length;i++){

//反編碼

byte[] buff=values[i].getBytes("iso8859-1");

//編碼後轉碼

values[i]=new String(buff,"GBk");  

 

}

}

 

String name=req.getParameter("uname");

out.println("歡迎您:"+name);

 

2,第二個hashMap:透過request得到請求頭的方法

/*得到Request的一些常用請求頭的方法 resp.setContentType("application/vnd.ms-excel;charset=utf-8");
application/vnd.ms-excel是excel表單的方式開啟,還可以設定為其他客戶端瀏覽器所支援的格式 
*/
resp.setContentType("text/html;charset=GBK"); req.setCharacterEncoding("GBK"); 
PrintWriter out=resp.getWriter();
//只有HttpServletRequest在可以得到頭資訊 HttpServletRequest request=(HttpServletRequest)req;
//得到請求頭的一個列舉
Enumeration enums=request.getHeaderNames(); 
//以表格的方式列印出來
out.print("<table border='1'>");
//是否有更多的元素 
while(enums.hasMoreElements()){
out.print("<tr>"); 
//從列舉中取得鍵 
String key=(String)enums.nextElement();
//透過鍵取值
String value=request.getHeader(key);  
out.print("<td>"+value+"</td>"); 
}
out.print("</table>"); 

3,第三個hashMap:透過request得到所有屬性的方法

PrintWriter out=resp.getWriter();   
//將請求轉為 Http的請求
HttpServletRequest request=(HttpServletRequest)req; 
//得到Request中所有的屬性 返回一個列舉型別   
Enumeration enums=request.getAttributeNames();   
//看列舉中是否有元素   
while(enums.hasMoreElements()){   
//從列舉中把鍵取出來   
String key=(String)enums.nextElement();   
//透過鍵取的值   
Object value=request.getAttribute(key);   
out.print(key+":"+value+"<br>");   
}

注意:會有 tomcat已經設好的三個值

javax.servlet.forward.request_uri /WebTest/page1.jsp
javax.servlet.forward.context_path /WebTest
javax.servlet.forward.servlet_path /page1.jsp

4,得到session,application

HttpServletRequest request = (HttpServletRequest)req;
String n1 = (String)request.getAttribute("name");
System.out.println("request:"+n1);
//得到session
HttpSession session = request.getSession();
String n2 = (String)session.getAttribute("name");
System.out.println("session:"+n2);
//得到application
//ServletContext application = session.getServletContext();
//用此方法只有再繼承了httpservlet類或 GenericServlet類才有
//ServletContext application = this.getServletContext();
//此方法適應於現實了servlet介面的servlet類
ServletContext application=
this.getServletConfig().getServletContext();
String n3 = (String)application.getAttribute("name");
System.out.println("application:"+n3);

5,ServletConfig和ServletContext的區別
ServletConfig記錄著單個服務員的資訊,比如說年齡,性別等
ServletConfig只能獲得自己的servlet資訊配置資訊
比如:以前獲取編碼引數的問題等

web.xml中

<servlet>
     <servlet-name>hello7</servlet-name>
     <servlet-class>com.accp.servlet.Hello7
</servlet-class>
     <init-param>
         <param-name>encoding</param-name>
         <param-value>
         text/html;charset=GB18030
      </param-value>
     </init-param>
     <init-param>
         <param-name>sex</param-name>
         <param-value>男</param-value>
     </init-param>
     <init-param>
         <param-name>age</param-name>
         <param-value>女</param-value>
     </init-param>
</servlet>
<servlet-mapping>
      <servlet-name>hello7</servlet-name>
      <url-pattern>/hello7</url-pattern>
</servlet-mapping>

Service()方法中

//ServletConfig使用,拿到Hello7這個servlet單獨的資訊
//獲取到該servlet所有引數名 
Enumeration configs = this.getServletConfig().getInitParameterNames();
while(configs.hasMoreElements()){
String key=(String)configs.nextElement();
    //根據引數名拿引數值
String value = this.getServletConfig().getInitParameter(key);
System.out.println(key+"--"+value);  
}

但是我們發現以前每個 servlet都要有編碼問題的設定,那我們能不能配置一個公有的,讓每一個Servlet都享有,其實可以配置一個公有資訊
問題是在 servlet中怎麼獲取這些公共的資訊?
web.xml中透過下面的配置公共資訊

<context-param>
    <param-name>encoding</param-name>
    <param-value>text/html;charset=GB18030</param-value>
</context-param>

ServletContext記錄著整個這個門店的資訊,也就是服務員工作壞境的資訊。比如牆壁是刷成什麼顏 色等,ServletContext儲存著整個公共的配置資訊

 //ServletContext使用,拿到整個公共的配置資訊
Enumeration contexts =this.getServletContext().getInitParameterNames();
while(contexts.hasMoreElements()){
String key=(String)contexts.nextElement();
String value = this.getServletContext().getInitParameter(key);
System.out.println(key+"--"+value);  
}

總結:

ServletConfig :記錄著單個servlet的資訊(單個服務員資訊:年齡 , 三圍等)
ServletContext:記錄著所有servlet共享的資訊(服務員上班的環境:牆壁顏色,裝置的型號等)

6,利用ServletContext,讀取WEB-INF目錄下的客戶端不可讀檔案
web-inf下面的檔案是不能被客戶端所訪問到的,其中web.xml主要描述的就是整個工程的配置
但是實際開發的過程中,就是希望客戶不能直接訪問我們的資源。但是在 servlet中又想獲取這些資源,那麼就可以透過ServletContext物件來獲取:

resp.setContentType("text/html;charset=GBk");
PrintWriter out=resp.getWriter();
ServletContext sct=this.getServletContext();
//獲取到檔案資源,並將它轉為檔案流(相對路徑)
InputStream in=sct.getResourceAsStream("/WEB-INF/abc.html");
Reader read=new InputStreamReader(in);//轉為字元流
BufferedReader reader=new BufferedReader(read);//改為包裝流
String str=reader.readLine();//讀取
while(str!=null){
out.print(str);//列印
str=reader.readLine();
}

reader.close();
read.close();
in.close();

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69940641/viewspace-2908215/,如需轉載,請註明出處,否則將追究法律責任。

相關文章