Servlet其實就是客戶端和服務(wù)器之間的翻譯官,請求的大致過程模擬:
1.服務(wù)器獲取http請求及資源
2.創(chuàng)建一個Servlet對象,同時在創(chuàng)建的過程中進行initialize
3.調(diào)用Servlet中的service方法,創(chuàng)建HttpRequest和HttpResponse對象
4.服務(wù)器關(guān)閉的時候銷毀Servlet對象
1.ServletConfig
作用:可以從配置文件中獲取某些特定的初始化參數(shù)
web.xml代碼
<servlet>
<description></description>
<display-name>MyConfig</display-name>
<servlet-name>MyConfig</servlet-name>
<servlet-class>com.itcased.servletconfig.MyConfig</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>hello</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyConfig</servlet-name>
<url-pattern>/myconfig</url-pattern>
</servlet-mapping>
注意:init-para標簽只能在最后插入,不然會報錯
Java代碼
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(config.getInitParameter("user"));
}
Servlet配置的標準格式
<servlet>
<servlet-name>abc</servlet-name>
<servlet-class>com.itcased.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>abc</servlet-name>
<url-pattern>/Urlabc</url-pattern>
</servlet-mapping>
url-pattern的三種匹配方式 1完全匹配 2目錄匹配 3擴展名匹配
缺省Servlet:如果/1.html在自己的web.xml配置文件中沒有找到,那么就去缺省/中找,如果找到了匹配的靜態(tài)資源,然后返回該對象。
2.ServletContext
web應(yīng)用的上下文對象,只有一個。
獲取ServletContext對象的方法:this.getServletContext()
兩個常用的作用:
1.獲取絕對路徑的兩種方式:
?1.context.getRealPath(para) 參數(shù)是相對于web-content的路徑
?2.this.class.getClassLoader().getResource(para).getPath() 參數(shù)是相對于classes文件的路徑
2.ServletContex是一個域?qū)ο?/em>
context.setAttribute(key,object)來進行對象的存儲
getAttribute(key)來進行對象的取出
removeAttribute(key)進行對象的移除
forexp:記錄登錄的人數(shù)并且完成用戶的登錄次數(shù)統(tǒng)計
package com.itcased.login;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.itcased.domain.User;
import com.itcased.utils.DataSourceUtil;
public class Login2 extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void init() throws ServletException {
//初始化時候設(shè)置一個count對象
int count=0;
this.getServletContext().setAttribute("count", count);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.獲得用戶名和密碼
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.通過數(shù)據(jù)庫來實現(xiàn)驗證
//response.getWriter().write(username);
QueryRunner qr=new QueryRunner(DataSourceUtil.getDataSource());
String sql="select * from user where username=? and password=?";
User user=null;
try {
user = qr.query(sql, new BeanHandler<User>(User.class), username,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user!=null){
response.getWriter().write("congratulations");
Integer count=(Integer) this.getServletContext().getAttribute("count");
count=count+1;
this.getServletContext().setAttribute("count", count);
response.getWriter().write("當前登錄次數(shù)為"+count);
}else{
response.getWriter().write("sorry");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注意:doGet和doPost根據(jù)當前頁面的提交方式來執(zhí)行響應(yīng)的方法
3.HttpRequest對象
3.1獲取網(wǎng)絡(luò)連接信息
//獲取http中的請求方式
System.out.println(request.getMethod());
//獲取http中的虛擬路徑
System.out.println(request.getRequestURI());
//獲取請求資源所屬web應(yīng)用的路徑
System.out.println(request.getContextPath());
//獲取客戶端的ip地址
System.out.println(request.getRemoteAddr());
3.2獲取請求頭信息
//獲取請求頭某個信息
System.out.println(request.getHeader("User-Agent"));
//獲取請求頭的所有信息
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String nextElement = headerNames.nextElement();
String header = request.getHeader(nextElement);
System.out.println(nextElement+"---"+header);
}
3.3獲取請求參數(shù)
request.getParameter() 獲取單一的參數(shù)
request.getParameterMaps() 獲取所有的參數(shù)
Map<String, String[]> map = request.getParameterMap();
for (Map.Entry<String, String[]> entry : map.entrySet()) {
for ( String st : entry.getValue()) {
response.getWriter().write(st);
}
}
3.4請求域?qū)傩?/h2>
request.getResquestDispatcher("url").forword(request,response)請求轉(zhuǎn)發(fā)
注意和重定向的區(qū)別:重定向是兩次請求,而請求轉(zhuǎn)發(fā)是一次請求,HttpRequest里面數(shù)據(jù)可以共享,類似于全局變量。
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/forward");
requestDispatcher.forward(request, response);
4.HttpResponse對象
response.sendRedict(url) 重定向
response.getWriter() 獲取響應(yīng)對象的輸出流 在那之前必須設(shè)置文本格式response.setContentType("text/html;charset=UTF-8")
完成文件下載
通過文件的mime類型去區(qū)分類型
5 完成的案例要求
1.用戶的注冊及登錄功能
運用BeanUtils工具把map集合映射到user對象中去
Map<String, String[]> parameterMap = request.getParameterMap();
User2 user2=new User2();
try {
//運用組件進行
BeanUtils.populate(user2, parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}