Java學習之Servlet

1、servlet簡介html

servlet(Server Applet)是Java Servlet的簡稱,稱爲小服務程序或服務連機器,用java編寫的服務端程序,主要功能在於交互式地瀏覽和修改數據,生成動態Web內容。java

通常的動態web項目WEB-INF下都會新建一個web.xml,可是我新建的沒有,經查詢,解決方式: 選這個就能夠生成web.xmlweb

 

 

在src下定義LoginServlet:重寫HttpServlet的doGet方法和doPost方法。瀏覽器

package cn.java.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("我是doGet方法");
//		super.doGet(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("我是doPost方法");
//		super.doPost(req, resp);
	}
		
}

web.xml中配置接口別名:tomcat

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
  <display-name>immoc_servlet1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 給LoginServlet類配置一個對外訪問的虛擬路徑 -->
  <servlet>
  	<servlet-name>LoginServlet</servlet-name>
  	<servlet-class>cn.java.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>LoginServlet</servlet-name>
  	<url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

 

能夠將baseUrl寫活:服務器

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
 <%
 	String basePath = request.getScheme() + ":" +"//"+request.getServerName()+":"+request.getServerPort()+ request.getServletContext().getContextPath()+"/";
 	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="<%=basePath %>LoginServlet" method="post">
		<p>用戶名:<input type="text" name="username"></p>
		<p>密碼:<input type="password" name="password"> </p>
		<input type="submit" value="提交">  
	</form>
</body>
</html>

 

servlet生命週期分爲三個階段session

1.初始化階段調用init()方法。(只有第一次被訪問的時候纔會執行)app

2.響應客戶請求階段調用service()方法。(每一次請求都會調用這個方法)jsp

3.終止階段調用destroy()方法。(工程從tomcat被移除的時候,調用這個方法)ide

 

新建一個Servelet,寫入以下代碼:

package cn.java.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/LifeServlet")
public class LifeServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
		doGet(request, response);
	}

}

response.getWriter() :得到PrintWriter對象,用於向網頁輸出字符。

request.getContextPath():獲取servlet訪問路徑中的工程名部分。

 

servlet裏面能夠經過註解來實現對外訪問虛擬路徑。上面的webServlet註解。

 

請求與響應

1.瀏覽器對服務器的一次訪問稱之爲一次請求,請求用HttpServletRequest對象來表示。

2.服務器給瀏覽器的一次反饋稱之爲一次響應,響應用HttpServletResponse對象來表示。

package cn.java.servlet;

import java.io.IOException;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		System.out.println(username);
		System.out.println(password);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req,resp);
	}
		
}

上面代碼經過如下這種方式能夠解決亂碼:

username = new String(username.getBytes("ISO-8859-1"), "UTF-8");

 

2、ServletContext和ServletConfig

java是一門面向對象的語言,萬事萬物皆對象。整個JavaWeb工程也能夠用一個對象來表示,這個對象就是ServletContext類型。

咱們能夠再web.xml文件中給某一個Servlet配置一些配置信息,當服務器被啓動的時候,這些配置信息就會被封裝到某一個ServletConfig對象中去,所以ServletConfig表示的是某一個Servlet配置文件。

 

新建Demo1Servlet 和 Demo2Servlet文件

分別寫入:

package cn.java.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * ServletContext對象:表示的是整個javaweb工程servletconfig對象:表示的是某一個Servelt中的配置文件
 * @author dongwenjie
 *
 */
@WebServlet("/Demo1Servlet")
public class Demo1Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 獲取表明某一個JavaWeb工程的ServletContext對象
		// Context對象是一個域對象,能夠往某一個域對象中存放數據,而且還能夠取出存放的數據 
		ServletContext context = this.getServletContext();
		// 往context域對象中存放數據
		context.setAttribute("username", "張三");
		// 取出context域對象中的數據
		Object result = context.getAttribute("username");
		// 打印取出結果
		System.out.println(result);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

package cn.java.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		ServletContext context = this.getServletContext();
		
		Object result = context.getAttribute("username");
		System.out.println(result);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

在文件1中設置username的值,訪問文件2中這個值就能夠取到。感受跟瀏覽器端的localStorage和sessionStorage很像。

 

servletconfig對象用法:

新建Demo3Servlet文件:

<!-- 給Demo3Servlet類配置一個對外訪問的虛擬路徑 -->
  <servlet>
  	<servlet-name>Demo3Servlet</servlet-name>
  	<servlet-class>cn.java.servlet.Demo3Servlet</servlet-class>
  	<init-param>
  		<param-name>encoding</param-name>
  		<param-value>utf-8</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>Demo3Servlet</servlet-name>
  	<url-pattern>/Demo3Servlet</url-pattern>
  </servlet-mapping>

在Demo3Servlet中獲取servletConfig對象。

package cn.java.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo3Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 首先獲取ServletConfig對象
		ServletConfig sc = this.getServletConfig();
		
		// 獲取sc這個對象中封裝的參數信息
		String encoding = sc.getInitParameter("encoding");
		System.out.println(encoding);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

3、轉發與重定向的區別

當咱們訪問一個servelet的時候,servelet幫咱們跳轉到另外的一個jsp頁面。跳轉就是用轉發和重定向來實現。

實現轉發調用的是HttpServletRequest對象中的方法,實現重定向調用的是HttpServletResponse對象中的方法。

轉發時瀏覽器中的url地址欄不會發生改變,重定向時瀏覽器中的url地址會發生改變。

轉發時瀏覽器只請求一次服務器,重定向時瀏覽器請求兩次服務器。

 

當登陸頁用戶名爲'admin' ,密碼爲'123'時,頁面轉發到成功頁面,不然到失敗頁面。

package cn.java.servlet;

import java.io.IOException;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
		System.out.println(username);
		System.out.println(password);
		// 1.經過轉發實現跳轉
		if (("admin".equals(username)) && ("123".equals(password))) {
			req.getRequestDispatcher("/success.jsp").forward(req, resp);
		} else {
			req.getRequestDispatcher("/fail.jsp").forward(req, resp);
		}

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

經過重定向實現跳轉:

package cn.java.servlet;

import java.io.IOException;

import javax.security.auth.message.callback.PrivateKeyCallback.Request;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String username = req.getParameter("username");
		String password = req.getParameter("password");
		username = new String(username.getBytes("ISO-8859-1"), "UTF-8");
		System.out.println(username);
		System.out.println(password);
		// 1.經過轉發實現跳轉
		if (("admin".equals(username)) && ("123".equals(password))) {
			req.getRequestDispatcher("/success.jsp").forward(req, resp);
		} else {
//			2.經過重定向實現跳轉
//			req.getRequestDispatcher("/fail.jsp").forward(req, resp);
			resp.sendRedirect("/immoc_servlet1/fail.jsp");
		}

	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doGet(req, resp);
	}

}

轉發和重定向給下一個頁面帶數據:

package cn.java.servlet;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse;


@WebServlet("/Demo4Servlet")
public class Demo4Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 轉發帶數據給某個JSP頁面
//		request.setAttribute("username", "王二麻子");
//		request.getRequestDispatcher("/demo.jsp").forward(request, response);
		
		//經過重定向帶數據過去
		ServletContext sc = request.getServletContext();
		sc.setAttribute("goods", "娃娃");
		response.sendRedirect("/immoc_servlet1/demo.jsp");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doGet(request, response);
	}

}

 

獲取數據

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>轉發與重定向獲取數據</title>
</head>
<body>
	<!-- 取出Demo04Servlet中傳遞過來的數據 -->
	<%-- <%
		String username = (String)request.getAttribute("username");
		out.print(username);
	%> --%>
	<%
		String goods = (String)application.getAttribute("goods");
		out.print(goods);
	%>
</body>
</html>
相關文章
相關標籤/搜索