一.ServletContext接口html
Servlet引擎爲每一個WEB應用程序都建立一個對應的ServletContext對象,ServletContext對象被包含在ServletConfig對象中,調用ServletConfig.getServletContext方法能夠返回ServletContext對象的應用。
因爲每個WEB應用程序中的全部Servlet都共享同一個ServletContext對象,因此,SevletContext對象被稱爲application對象(WEB應用程序對象)。java
功能:mysql
1.獲取web應用程序的初始化參數
2.記錄日誌
3.appliciation域範圍的屬性
4.訪問資源文件
5.獲取虛擬路徑所映射的本地路徑
6.web應用程序之間的訪問
7.ServletContext的其餘方法web
ServletContext:
1).能夠由ServletConfig獲取
2).該對象表明當前web應用:能夠認爲ServletContext是當前WEB應用的一個大管家,能夠從中獲取當前web應用的各個方面的信息。
sql
2.1獲取當前web應用的初始化參數:能夠爲全部的Servlet所獲取,而Servlet的初始化參數只能用那個Servlet能夠獲取數據庫
1 <context-param> 2 <param-name>driver</param-name> 3 <param-value>com.mysql.jdbc.Driver</param-value> 4 </context-param> 5
方法:
getInitParameter
getinitParameterNames
數組
代碼:瀏覽器
ServletContext servletContext=servletConfig.getServletContext(); String driver=servletConfig.getInitParameter("driver"); System.out.println("driver"+driver); Enumeration<String> names2=servletContext.getInitParameterNames(); while(names2.hasMoreElements()) { String name=names2.nextElement(); System.out.println("-->"+name); }
2.2獲取當前WEb應用的某一個文件在服務器上的絕對路徑,而不是部署前的路徑
getRealPath(String path);
2.3獲取WEB應用的名稱;
getContextPath()服務器
代碼:app
String contextPath=servletContext.getContextPath();
System.out.println(contextPath);
2.4獲取當前WEB應用的某一個文件對應的輸入流
getResourceAssStream(String path):path的/爲當前WEB應用的根目錄.
代碼:
Classloader classLoader=getClass.getClassLoader();
InputStream is2=servletContext.getResourceAssStream("jdbc.properties");
System.out.println("1."+is);("/WEB-INF/classes/jdbc.properties");
本身新建一個jdbc.properties
2.5和atttrubute相關的幾個方法
二.Http簡介
WEB瀏覽器與WEB服務器之間的一問一答的交互過程必須遵循必定的規則,這個規則就是HTTP協議
HTTP是hypertext transfer protocol(超文本傳輸協議)的簡寫,它是TCP/IP協議集中的一個應用層協議,用於定義web瀏覽器與WEB服務之間交換 數據的過程以及數據自己的格式。
HTTP協議的版本HTTP/1.0,HTTP/1.1,HTTP-NG
使用GET和POST方式傳遞參數
在URL地址後面能夠附加一些參數
舉例:http://www.it1315.org/servlet/ParamsServlet?param1=abc¶m2=xyz
GET方式
舉例:GET/servlet/param1=abc¶m2=xyz HTTP/1.1
特色:傳送的數據量是有限制的,通常限制在1kb如下
POST方式
舉例:POST/servlet/param1=abc¶m2=xyz HTTP/1.1
Host:
Content-Type:appliciation/x-www-form-urlencoded
Context-Length:28
param1=abc¶m2=xyz
特色:傳送的數據量要比GET方式傳送的數據量大得多
Get請求和Post請求:
1).使用GET方式傳遞參數:
1.1在瀏覽器地址中輸入某個URL地址或單擊網頁上的一個超連接時,瀏覽器發出的HTTP請求消息的方式爲GET
1.2若是網頁中的<form>表單元素中的method屬性被設置爲"GET",瀏覽器提交這個FORM表單時生成的HTTP請求消息的請求方式也爲GET.
1.3使用GET請求方式給WEB服務器傳遞參數的格式:
http://www.atguigu.net/counter.jsp?name&password=123
1.4使用GET方式傳送數據量通常限制在1kb如下。
2).使用POST方式傳遞參數:
2.1 POST請求方式主要向WEB服務器端程序提交FORM表單中的數據:form表單中的method置爲POST
2.2 POST方式將各個表單字段元素及其數據做爲HTTP消息的實體內容發送給WEB服務器,傳送的數據量要比使用GET方式傳送的數據量大得多。
POST/counter.jsp HTTP/1.1
referer:http://localhost:8080/Register.html
content-type:application/x-www-form-urlencoded
host:localhost:8080
content-length:43
name=zhangsan&password=123 --請求體重傳遞參數。
三.如何在Servlet中獲取請求信息:
1).Servlet的service()方法用於應答請求:由於每次請求都會調用service()方法。
public void service(ServletRequest request,ServletResponse response)throws ServletException,IOEcxeption
ServletRequest:封裝了請求信息,能夠從中獲取到任何的請求信息
ServletResponse:封裝了響應信息,若是想給用戶什麼響應,具體可使用該接口的實現方法
2).這兩個接口的實現類都是服務器給與實現的,並在服務器調用service方法時傳入
ServletRequest:
2.1獲取請求參數;
>String getParameter(String name):根據請求參數的名字,返回參數值。
>Map getParameterNames():返回請求參數的鍵值對:參數名,value:參數值,String數組類型
Enumeration getParameternames():返回參數名對應的Enumeration對象,
相似於ServletConfig(或ServletContext)的getInitParameterNames(方法)。
>String[] get ParameterValues(String name):根據請求參數的名字,返回字符串數組。
若請求參數有多個值(例如checkbox),該方法只能獲取到第一個提交的值。
2.2獲取請求的URl:
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
String requestURI=httpServletRequest.getRequestURI();
System.out.println(requestURI);
2.3獲取請求方式:
String Method=httpServletRequest.getMethod();
System.out.println(Method);
2.4如果一個GET請求,獲取請求參數對應的那個字符串,就是?後面的那個字符串
String queryString=httpServletRequest.getQueryString();
System.out.println(queryString);
2.5獲取請求的Servlet的映射路徑
String servletPath=httpServletRequest.getServletPath();
System.out.println(servletPath);
2.6和attribute相關的幾個方法
3).HttpServletRequest:是ServletRequest的子接口,針對於HTTP請求所定義,裏面包含了大量獲取HTTP請求相關的方法。
4).
ServletResponse:封裝了響應信息,若是想給用戶什麼響應,具體可使用該接口的實現方法
4.1 getWriter():返回PrintWriter對象,調用該對象的print()方法,將print()中的參數直接打印到客戶的瀏覽器上。PrintWriter out=reponse.getWriter();
out.println("hello world...");
4.2 設置響應的內容類型setContextType()
reponse.setContentType("application/msword");
4.3 void sendRedirect(String Location):請求的重定向。(此方法爲HttpServletReponse 中定義。)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
練習:在web.xml文件中設置兩個WEB應用的初始化參數,user,password.
定義一個login.html,裏面定義兩個請求字段:user,password
在建立一個LoginServlet,在其中獲取請求的user,password。比對其和web.xml文件中定義的請求參數是否一致,若一致,響應hello:xxx,若不一致,響應sorry:xxx xxx爲user.
目錄:
web.mxl
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <servlet> <servlet-name>loginServlet</servlet-name> <servlet-class>com.yuyi.javaweb.loginServlet</servlet-class> <init-param> <param-name>user</param-name> <param-value>root</param-value> </init-param> <init-param> <param-name>password</param-name> <param-value>123</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>loginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping> </web-app>
login,html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登陸界面</title> </head> <body> <form action="loginServlet" method="post"> user:<input type="text" name="user"> password:<input type="password" name="password"> <br><br> interesting: <input type="checkbox" name="interesting" value="reading"/>Reading <input type="checkbox" name="interesting" value="game"/>Game <input type="checkbox" name="interesting" value="shopping"/>Shopping <input type="checkbox" name="interesting" value="party"/>Party <input type="checkbox" name="interesting" value="sport"/>Sport <input type="checkbox" name="interesting" value="sing"/>Sing <input type="submit" value="Submit"> </form> </body> </html>
loginServlet.java
package com.yuyi.javaweb; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.EnumMap; import java.util.Enumeration; import java.util.Map; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; public class loginServlet implements Servlet{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public void service(ServletRequest request, ServletResponse reponse) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("請求來了!"); System.out.println(reponse); String user=request.getParameter("user"); String password=request.getParameter("password"); System.out.println(user+","+password); String interesting=request.getParameter("interesting"); System.out.println(interesting); String[] interestings=request.getParameterValues("interesting"); for(String intertest:interestings) { System.out.println("interesting:"+intertest); } Enumeration<String> names=request.getParameterNames(); while(names.hasMoreElements()) { String name=names.nextElement(); String val=request.getParameter(name); System.out.println(val); } Map<String,String[]>map=request.getParameterMap(); for(Map.Entry<String, String[]>entry:map.entrySet()) { System.out.println(entry.getKey()+":"+Arrays.asList(entry.getValue())); } HttpServletRequest httpServletRequest=(HttpServletRequest)request; String requestURI=httpServletRequest.getRequestURI(); System.out.println(requestURI); String Method=httpServletRequest.getMethod(); System.out.println(Method); String queryString=httpServletRequest.getQueryString(); System.out.println(queryString); String servletPath=httpServletRequest.getServletPath(); System.out.println(servletPath); reponse.setContentType("application/msword"); PrintWriter out=reponse.getWriter(); out.println("hello world..."); } }
四.GenericServlet(瞭解)
1).是一個Servlet.是Servlet接口和ServletConfig接口的實現類,可是一個抽象類,其中的service方法爲抽象方法
2).若是新建的Service程序直接繼承GenericsServlet會使開發更簡潔
3.1.在GenericServlet聲明瞭一個ServletConfig類型的成員變量,在init(ServletConfig)方法對其初始化
3.2利用servletConfig成員變量的方法實現了ServletConfig接口的方法
3.還定義了一個init(Config)方法,在init(ServletConfig)方法對其調用,子類能夠直接覆蓋init()在其中實現對Servlet的初始化
4.不建議直接覆蓋init(ServletConfig),由於若是忘記編寫super(ServletConfig),仍是用了ServletConfig接口的方法,則會出現空指針異常
3.5新建的init{}並不是Servlet的生命週期方法,而intit(ServletConfig)是生命週期相關的方法.
package com.yuyi.ServletTest; import java.io.IOException; import java.util.Enumeration; /** * 自定義的一個Servlet接口實現類,讓任何開發Servlet繼承該類,以簡化開發 */ import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public abstract class MyGenericServlet implements Servlet,ServletConfig{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return ServletConfig; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } private ServletConfig ServletConfig; @Override public void init(ServletConfig arg0) throws ServletException { this.ServletConfig=arg0; } @Override public abstract void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException ; /** 如下方法爲ServletConfig接口的方法**/ @Override public String getInitParameter(String arg0) { // TODO Auto-generated method stub return ServletConfig.getInitParameter(arg0); } @Override public Enumeration<String> getInitParameterNames() { // TODO Auto-generated method stub return ServletConfig.getInitParameterNames(); } @Override public ServletContext getServletContext() { // TODO Auto-generated method stub return ServletConfig.getServletContext(); } @Override public String getServletName() { // TODO Auto-generated method stub return ServletConfig.getServletName(); } }
2.HttpServlet:
1).是一個Servlet,繼承自Genericservlet.針對於Http協議所定製。
2).在service()方法中直接把ServletRequest和ServletReponse轉爲HttpRequest和HttpReponse
並調用了重載的service(HttpRequest,HttpReponse)
在service(HttpRequest,HttpReponse)獲取了請求方式:request.getMethod().
doxxx() 方法(xxx 爲具體的請求方式,好比doGet,doPost)
代碼:
public class MyHttpServletRequest extends MyGenericServlet{
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
if(arg0 instanceof HttpServletRequest) {
HttpServletRequest request=(HttpServletRequest)arg0;
if(arg1 instanceof HttpServletResponse) {
HttpServletResponse response=(HttpServletResponse)arg1;
service(arg0, arg1);
}
}
}
public void service(HttpServletRequest request,HttpServletResponse reponse) throws ServletException,IOException{
//1.獲取請求方式。
String method=request.getMethod();
//2.根據請求方法再調用對應的處理
方法
if("GET".equalsIgnoreCase(method)) {
doGet(request,reponse);
}
else if("POST".equalsIgnoreCase(method)) {
doPost(request,reponse);
}
}
private void doPost(HttpServletRequest request, HttpServletResponse reponse) {
// TODO Auto-generated method stub
}
private void doGet(HttpServletRequest request, HttpServletResponse reponse) {
// TODO Auto-generated method stub
}
}
3).實際開發中,直接繼承httpServlet,並根據請求方式複寫doxxx()方法接口
4).好處:直接由針對的覆蓋doxxx方法;直接使用HttpServletrequest和Httpreponse,不須要強轉。
在MySQl數據庫建立一個test_users數據表,添加三個字段
定義一個login.html,裏面定義兩個請求字段:id,user,password.並錄入幾條記錄user,password
在建立一個LoginServlet(須要繼承自HttpServlet,並重寫doPost方法),在其中獲取請求的user,password。利用JDBC從test_user中查詢有沒有和頁面輸入的user,password對應的記錄,
SELECT count(id) FROM test_users WHERE user=?
如有,響應Hello:xxx,若不一致,響應sorry:xxx xxx爲user.
1.數據庫的話就本身創建
2.目錄
3.web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 初始化參數 --> <context-param> <param-name>user</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>password</param-name> <param-value>123456</param-value> </context-param> <!-- 配置servlet --> <servlet> <servlet-name>loginServlet3</servlet-name> <servlet-class> com.yuyi.ServletTest.loginServlet3</servlet-class> </servlet> <servlet-mapping> <servlet-name>loginServlet3</servlet-name> <url-pattern>/loginServlet3</url-pattern> </servlet-mapping> </web-app>
4.login.html
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登陸界面</title> </head> <body> <form action="loginServlet3" method="post"> user:<input type="text" name="username"/> password:<input type="password" name="password"/> <input type="submit" value="Submit"/> </form> </body> </html>
5.loginServlet3.java
package com.yuyi.ServletTest;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class loginServlet3 extends HttpServlet{
@Override
protected void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
Connection connection=null;
PreparedStatement statement=null;
ResultSet resultSet=null;
PrintWriter out=response.getWriter();
String sql="SELECT count(id)from users WHERE username=?"+"AND password=?";
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/test";
String user="root";
String password2="628081abc";
connection=(Connection) DriverManager.getConnection(url,user,password2);
statement=(PreparedStatement) connection.prepareStatement(sql);
statement.setString(1, username);
statement.setString(2, password);
resultSet=statement.executeQuery();
if(resultSet.next()) {
int count=resultSet.getInt(1);
if (count>0) {
out.println("Hello,"+username);
}else {
out.println("sorry,"+username);
}
}
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(resultSet!=null) {
resultSet.close();
}
}catch(SQLException e){
e.printStackTrace();
}
try {
if(statement!=null) {
statement.close();
}
} catch (SQLException e) {
}
try {
if(connection!=null) {
connection.close();
}
} catch (SQLException e) {
}
}
}
}