1.讀取文件的兩種方式
1.1Servlet讀取
ServletContext servletContext = this.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/db.properties");
InputStream inputStream = new FileInputStream(realPath);
Properties properties = new Properties();
properties.load(inputStream);
String driverClass = properties.getProperty("driverClass");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println(driverClass);
System.out.println(url);
System.out.println(username);
System.out.println(password);
1.2類加載器讀取
public static void readFile() throws Exception{
// 使用類加載器來讀取文件
// 類加載器用來加載Class文件,將Class文件加載到內存
InputStream inputStream = ReadFileUtils.class.getClassLoader().getResourceAsStream("db.properties");
Properties properties = new Properties();
properties.load(inputStream);
String driverClass = properties.getProperty("driverClass");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println(driverClass);
System.out.println(url);
System.out.println(username);
System.out.println(password);
}
2.文件下載
兩種方式:
超鏈接下載:直接將文件的路徑寫到超鏈接的href中—-有些文件的類型,瀏覽器不支持。
第二種:手動編寫代碼- Content-type :文件的MIME類型
- COntent-Disposition :以下載的形式打開文件
- InputStream : 文件的輸入。
2.1超鏈接下載方式
<h3>超鏈接方式下載link</h3>
<a href = "/WebExercise/download/Control box App Comparasion.xlsx">Control box App Comparasion.xlsx</a><br>
<a href = "/WebExercise/download/PW3RE001 EMEA.zip">PW3RE001 EMEA.zip</a><br>
<a href = "/WebExercise/download/打印.pdf">打印.pdf</a><br>
2.2Servlet下載方式
<h3>手動編碼方式下載</h3>
<a href = "/WebExercise/DownloadServlet?filename=Control box App Comparasion.xlsx">Control box App Comparasion.xlsx</a><br>
<a href = "/WebExercise/DownloadServlet?filename=PW3RE001 EMEA.zip">PW3RE001 EMEA.zip</a><br>
<a href = "/WebExercise/DownloadServlet?filename=打印.pdf">打印.pdf</a><br>
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 1.接收數據
String filename = request.getParameter("filename");
// 2.完成文件的下載
// 2。1設置Contenttype頭
String type = this.getServletContext().getMimeType(filename);
response.setHeader("Content-type", type);
// 2.2設置Content-disposition頭
response.setHeader("Content-Disposition", "attachement;filename="+filename);
// 2.3設置文件的InputStream
String realPath = this.getServletContext().getRealPath("/download/"+filename);
InputStream inputStream = new FileInputStream(realPath);
// 獲得response的輸出流
OutputStream outputStream = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
inputStream.close();
}
3.中文文件的下載
IE瀏覽器下載中文文件的時候,採用的是URL的編碼
Firefox連藍琪下載中文件的時候才用的還是Based64 編碼。
public static String base64EncodeFileName(String fileName) {
BASE64Encoder base64Encoder = new BASE64Encoder();
try {
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
} catch (UnsupportedEncodingException e) {
// TODO: handle exception
e.printStackTrace();
throw new RuntimeException();
}
}
4.response輸出相應內容的方法
- 想頁面響應的方法:
getOutputStream();
getWriter();
**使用的時候只能使用其中一種。
- 輸出中文亂碼的問題
字節流:
*設置瀏覽器的默認打開的編碼:
response.setHeader(“Content-type”, “text/html;charset=UTF-8”);
*設置中文字節取出的時候編碼:
“中文”.getBytes(“UTF-8”);
字符流:
*設置瀏覽器默認打開的編碼
response.setHeader(“Content-type”, “text/html;charset=UTF-8”);
*設置response的緩衝區的編碼
response.setCharacterEncoding(“UTF-8”);
*簡化寫法:response.setContentType(“text/html;charset=UTF-8”);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 使用字節流響應數據:
// response.getOutputStream().write("hello response i am tommy武藤蘭".getBytes());
// 使用字符流響應數據
// response.getWriter().println("tommy i lvoe you");
// response.getWriter().append("Served at:Tommy! ").append(request.getContextPath());
test2(response);
}
/*
* 使用字節流輸出中文會不會有亂碼?
* -----不一定。
* *設置中文轉成字節數組取出的時候編碼
* *設置瀏覽器默認打開的時候編碼
* */
private void test1(HttpServletResponse response) throws IOException {
// 設置瀏覽器默認打開的時候採用的字節編碼
response.setHeader("Content-type", "text/html;charset=UTF-8");
// 設置中文轉成字節數組的時候取出的編碼
response.getOutputStream().write("蒼井空".getBytes("UTF-8"));
}
/*
* 使用字符流輸出中文會不會有亂碼?
* -----一定有,response使用的字符流有緩衝區。
* *response的字符流的緩衝區的默認的編碼是ISO-8859-1,編碼不支持中文。
* *設置response的字符流的緩衝區的編碼。
* *設置瀏覽器默認打開的時候所採用的字符編碼。
* */
private void test2(HttpServletResponse response) throws IOException {
// 設置瀏覽器默認打開的時候所採用的字符編碼
// 設置瀏覽器默認打開的時候採用的字節編碼
// response.setHeader("Content-type", "text/html;charset=UTF-8");
// 設置response的字符流的緩衝區的編碼
// response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("燦老師蒼老師,我來了");
}
5.Request(完成一個註冊的功能):
5.1Request的概述
Request代表用戶的請求。
【Request的API】
*【功能一】:獲得客戶機相關的信息
獲得請求的方式:String — getMethod()
獲得請求的路徑: String — getRequestURI()、、、StringBuffer — getRequestURI();
獲得客戶機相關的信息:String — getRemoteAddr()
獲得工程名:String — getContextPath();
*【功能二】:獲得從頁面提交的參數
String — getParameter()
Map — getParameterMap()
Enumeartion — getParameterNames()
String — getParameterValues(String name);
*【功能三】作爲域對象存儲數據
removeAttribute(String name)
setAttribute(String name,Object o)
getAttribute(String name)
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
try {
request.setCharacterEncoding("UTF-8");
// 1.接受參數
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String name = request.getParameter("name");
String sex = request.getParameter("sex");
String telephone = request.getParameter("telephone");
// 2.封裝數據
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
user.setName(name);
user.setSex(sex);
user.setTelephone(telephone);
// 3.調用業務層處理數據
UserService userService = new UserService();
userService.register(user);
// 4. 頁面的跳轉
response.sendRedirect(request.getContextPath()+"/demo3login/login.html");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
5.2Request中問亂碼的問題
現在無論是GET還是POST提交中文的時候,都會出現亂碼的問題。
POST解決方案:
*1.POST參數在請求體中,直接到達後臺的Servlet,數據封裝到Servlet中的request中,request也有一個緩衝區,request的緩衝區也是ISO-8859-1編碼。
*2.設置緩衝區的編碼:request.setCharacterEncoding(“UTF-8”); —一定要在接受參數之前設置編碼。
GET的解決方案
*1.修改tomcat的字符集編碼,(不推薦)。
*2.使用URLEncoder和URLDecoder進行編碼和解碼的操作。
*3.使用String的構造方法(推薦)。String(byte[] byte,String CharsetName);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// String name = request.getParameter("name");
// String ssName = new String(name.getBytes("ISO-8859-1"), "UTF-8");
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
System.out.println("get method"+name);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// doGet(request, response);
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("get method"+name);
}
5.3Request域對象的作用範圍
使用Request對象存取數據
*setAttribute(String name,String Value)。
*Object getAttribute(String name)
request作用範圍:
*1.作用範圍就是一次請求的範圍。
*2.創建和銷燬:
*2.1創建:客戶端向服務器發送了一次請求以後,服務器就會創建一個request對象。
*2.2銷燬:當服務器對這次請求做出響應之後。
5.4重定向和轉發的區別:(redirect和forward的區別)
*1.重定向的地址欄會發生變化;轉發的地址欄不會變化。
*2.重定向兩次請求兩次響應;轉發一次請求一次響應。
*3.重定向路徑需要加工程名;轉發的路徑不需要加工程名。
*4.重定向可以跳轉到任意網站;轉發只能在服務器內部跳轉。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 重定向
request.setAttribute("name", "XXX"); ---重定向情況下,顯示NUll,因爲重定向是兩次請求。
response.sendRedirect("/WebExercise/ForwardServlet2");
// 轉發
// request.setAttribute("name", "XXX"); --- 轉發情況下,顯示XXX。
// request.getRequestDispatcher("/ForwardServlet2").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name = (String) request.getAttribute("name");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("servlet2 .... forward"+"\t+"+name);
}