一:Servlet容器
Servlet容器:運行Servlet、JSP、Filter等的軟件環境
可以用來創建Servlet,並調用Servlet的相關聲明週期的方法
Servlet生命週期的方法:Servlet容器負責調用
一:構造器 只被調用一次只有第一次請求Servlet時創建Servlet的實例,調用構造器。單實例
二:init只被調用一次在創建好實例後立即被調用,用於初始化當前的Servlet
三:service被多次調用每次請求都會調用service方法實際用於響應請求的
四:destroy只被調用一次,在當前Servlet所在的web應用被卸載前調用,用於
釋放當前Servlet所佔用的資源。
load-on-startup1/load-on-startup:可以指定Servlet被創建的實際若爲負數,則在第一次
請求時被創建若爲0或正數,則在當前WEB應用被Servlet容器加載時創建實例,且數組越小,越早被創建。
servlet-mapping:servlet映射
ServletContext該對象代表web應用可從中獲取到當前web應用的各個方面的信息。
代碼示例:
public class HelloServlet implements Servlet {
public HelloServlet(){
System.out.println("constructor.........");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init.........");
String user = servletConfig.getInitParameter("user");
System.out.println(user);
Enumeration<String> names=servletConfig.getInitParameterNames();
while (names.hasMoreElements()){
String name=names.nextElement();
System.out.println(name);
}
//獲取servlet名
String servletName=servletConfig.getServletName();
System.out.println(servletName);
//獲取ServletContext對象
ServletContext servletContext=servletConfig.getServletContext();
String driver=servletContext.getInitParameter("driver");
System.out.println("driver: "+driver);
Enumeration<String> names1=servletContext.getInitParameterNames();
while (names1.hasMoreElements()){
String name=names.nextElement();
String value=servletContext.getInitParameter(name);
System.out.println(name+"\t"+value);
}
//獲取當前web應用上一個文件在服務器上的絕對路徑
String realPath=servletContext.getRealPath("/note.txt");
System.out.println(realPath);
//獲取當前web應用的名稱
String contextPath=servletContext.getContextPath();
System.out.println(contextPath);
//獲取某個文件的輸入流
//方式一
InputStream inputStream=
servletContext.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
//方式二
ClassLoader classLoader=getClass().getClassLoader();
InputStream inputStream1=classLoader.getResourceAsStream("jdbc.properties");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service.........");
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo");
return null;
}
@Override
public void destroy() {
System.out.println("destroy...");
}
}
在servlet中獲取請求信息
Servlet的service方法用於應答請求,因爲每次請求都會調用service()方法
service方法中的參數:
servletRequest:封裝了請求信息,可以從中獲取到任何的請求信息
獲取請求參數
servletResponse:封裝了相應信息,可給用戶給與響應。
代碼示例:
public class LoginServlet implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service 請求。。。");
String user=servletRequest.getParameter("user");
String password=servletRequest.getParameter("password");
System.out.println("User:\t "+user+"Password: \t"+password);
//獲取多個值返回字符串對應的字符串數組
String[] habits=servletRequest.getParameterValues("habits");
for(String strings:habits){
System.out.println(strings+"\t");
}
//獲取Enumeration
Enumeration<String> names=servletRequest.getParameterNames();
while(names.hasMoreElements()){
String name=names.nextElement();
System.out.println(name);
}
//獲取Map
Map<String,String[]> map=servletRequest.getParameterMap();
for(Map.Entry<String ,String[]> entry:map.entrySet()){
System.out.println(entry.getKey()+":\t"+entry.getValue());
}
//獲取請求的URI
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
String uri=httpServletRequest.getRequestURI();
//獲取請求方式
String method = httpServletRequest.getMethod();
System.out.println(method);
//servletResponse對象
PrintWriter writer = servletResponse.getWriter();
writer.println("HelloRoot");
//設置響應的內容類型
servletResponse.setContentType("application/msword");//響應爲word
/*
* 比對user和password是否和web.xm l中的一致
* */
ServletContext servletContext=servletConfig.getServletContext();
String user1 = servletContext.getInitParameter("user");
String password1 = servletContext.getInitParameter("password");
//進行比對並響應
if(user1.equals(user) && password1.equals(password)){
writer.println("Hi: \t"+ user);
}else{
writer.println("sorry:\t"+user);
}
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
login.html代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="loginServlet" method="post">
user:<input type="text" name="user"/>
password:<input type="password" name="password"/>
<hr>
<input type="checkbox" name="habits" value="swimming"/>Swimming
<input type="checkbox" name="habits" value="HangOut"/>HangOut
<input type="checkbox" name="habits" value="Gaming"/>Gaming
<input type="checkbox" name="habits" value="KongFu"/>KongFu
<input type="checkbox" name="habits" value="BasketBall"/>BasketBall
<input type="submit"value="submit"/>
</form>
</body>
</html>
二.自定義GenericServlet
可以讓servlet繼承使用可以不用實現Servlet接口
GenericServlet:是一個Servlet接口和ServletConfig接口的實現類是一個抽象類,其中的
service方式是一個抽象方法。
新建的Servlet程序直接繼承GenericServlet可使得開發簡潔
具體實現步驟:在GenericServlet中聲明瞭一個ServletConfig類型的成員變量,在init(ServletConfig)方法中對其進行了初始化。
利用servletConfig成員變量的方法實現了ServletConfig接口的方法
還定義了一個init()方法在init(ServletConfig)方法中對其進行調用,子類可以直接調用init方法在其中實現對Servlet的初始化。
代碼示例:
public class MyGenericServlet implements Servlet,ServletConfig {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
//ServletConfig對象
@Override
public String getServletName() {
return servletConfig.getServletName();
}
@Override
public ServletContext getServletContext() {
return servletConfig.getServletContext();
}
@Override
public String getInitParameter(String s) {
return servletConfig.getInitParameter(s);
}
@Override
public Enumeration<String> getInitParameterNames() {
return servletConfig.getInitParameterNames();
}
}
HttpServlet:是一個繼承與GenericServlet的servlet針對於HTTP協議所定製
在實際開發中直接繼承與HttpServlet並根據請求的方式複寫doXX()方法
在servlet中獲取請求信息
Servlet的service方法用於應答請求,因爲每次請求都會調用service()方法
service方法中的參數:
servletRequest:封裝了請求信息,可以從中獲取到任何的請求信息獲取請求參數
servletResponse:封裝了相應信息,可給用戶給與響應。
public class MyHttpServlet extends MyGenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
super.service(servletRequest, servletResponse);
if(servletRequest instanceof HttpServletRequest){
HttpServletRequest httpServletRequest=(HttpServletRequest)servletRequest;
if(servletResponse instanceof HttpServletResponse){
HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
service(httpServletRequest,httpServletResponse);
}
}
}
public void service(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)throws ServletException, IOException{
//獲取請求方式
String method=httpServletRequest.getMethod();
//根據調用方式使用相應的方式
if("GET".equalsIgnoreCase(method)){
doGet(httpServletRequest,httpServletResponse);
}
if("POST".equalsIgnoreCase(method)){
doPost(httpServletRequest,httpServletResponse);
}
}
public void doPost(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse)throws ServletException, IOException {
}
public void doGet(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse)throws ServletException, IOException {
}
}
public class LoginServlet2 extends HttpServlet {
private static final long serialVersionUID=3125435L;
public void doPost(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws IOException {
//獲取請求方式
String method = httpServletRequest.getMethod();
//獲取請求參數
String user=httpServletRequest.getParameter("user");
String password=httpServletRequest.getParameter("password");
//獲取初始化參數
String user1 = getServletContext().getInitParameter("user");
String password1 = getServletContext().getInitParameter("password");
PrintWriter writer = httpServletResponse.getWriter();
//進行比對並響應
if(user1.equals(user) && password1.equals(password)){
writer.println("Hi: \t"+ user);
}else{
writer.println("sorry:\t"+user);
}
}
public void doGet(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) {
}
}
public class LoginServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user=req.getParameter("user");
String password=req.getParameter("password");
String sql="select count(id) from user where name = ? and pwd= ?";
//獲取數據庫連接
Connection connection=null;
PreparedStatement preparedStatement=null;
ResultSet resultSet=null;
PrintWriter out=resp.getWriter();
try {
Class.forName("com.mysql.jdbc.Driver");
String Url="jdbc:mysql:///test";
String use="root";
String pass="123456";
connection=DriverManager.getConnection(Url,use,pass);
preparedStatement =connection.prepareStatement(sql);
preparedStatement.setString(1,user);
preparedStatement.setString(2,password);
//
resultSet=preparedStatement.executeQuery();
if(resultSet.next()){
int count=resultSet.getInt(1);
if(count>0){
out.print("hello:"+user);
}else{
out.print("sorry"+user);
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
if(resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(preparedStatement!=null){
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
以上代碼中的web.xml配置信息如下:
<?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">
<!--配置當前web應用的初始化參數-->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcUrl</param-name>
<param-value>jdbc:mysql:///test</param-value>
</context-param>
<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>helloServlet</servlet-name>
<!--Servlet的全類名-->
<servlet-class>cn.javaweb.com.HelloServlet</servlet-class>
<init-param>
<!--參數名-->
<param-name>user</param-name>
<!--參數值-->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>Sky</param-name>
<param-value>123456</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--需要和某一個servlet節點的servlet-name子節點的文本節點一致-->
<servlet-name>helloServlet</servlet-name>
<!--映射具體的訪問路徑:/代表當前WEB應用的根目錄-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.javaweb.com.LoginServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
</web-app>