Servlet--response and Resquest

Source: Internet
Author: User
Tags browser cache

When a Servlet is first created by a WEB server, a Response and Request object is passed through.

When the WEB server receives the HTTP request from the client, it creates a Response object for each request that represents the requested Resquest object and represents the response.

First, HttpServletResponse

1, commonly used methods:

SetStatus (int SC)---Set the status code to respond to the client

SetHeader (String name,string value)---Set a response header information

Getwriter ()---Get a stream of characters to output to the client machine

Getoutputstream ()---Get the byte stream output to the client machine

Second, OutputStream output Chinese garbled problem

When the server writes to response as Chinese, response encodes the Chinese according to the local character encoding, for example, the local computer is encoded as gb2312, and the server encodes it in gb2312 way. Then pass the data to the remote client, because the client receives the data instead of Chinese, the client browser will decode the data according to the browser encoding, and if the client's browser is inconsistent with the server, then the garbled problem arises. Solution:

(1) Write a message header message to the response object informing the client that the browser is decoding with the specified encoding

public void Test1 (HttpServletResponse response) throws ioexception{Response.setheader
		("Content-type", "text/ Html;charset=utf-8 ");
		Response.getoutputstream (). Write (("China"). GetBytes ("Utf-8"));
	


(2) using <meta> tag to simulate the HTTP response message header, this method does not use the HTTP protocol to send message headers, but instead directly in the source file as a <meta> declaration

public void Test2 (HttpServletResponse response) throws ioexception{Response.getoutputstream
		(). Write ("<meta http-equiv= ' Content-type ' content= ' text/html;charset=utf-8 ' > '. getBytes ());
		Response.getoutputstream (). Write (("China"). GetBytes ("Utf-8"));
	



(3) When this is output to the browser: Response.getoutputstream (). write (1); , the browser will still display garbled, because the browser is a character resolution tool, it will be in its current encoding method to find 1 of the corresponding characters, obviously will appear garbled.  should be modified to: Response.getoutputstream (). Write ((1 + ""). GetBytes ()); Convert 1 to String 1, and in all the code tables, character 1 is the same encoding.

Third, PrintWriter output Chinese garbled problem

Unlike OutputStream, because both PrintWriter and OutputStream write data to response, the response caches the data in the form of a byte array, because OutputStream gets Is binary data that is stored directly in the buffer, so the previously specified character encoding can be used normally. And PrintWriter is a saved character data, when saved to response, will use ISO8859-1 encoding to encode the characters, so no matter how previously specified encoding method, the final changes will not play a role, so we are using PrintWriter When writing data, you first specify the encoding of the response. Solution:

1, first set the encoding in the response, and then write to the client message header, specify the encoding method

	public void Test1 (HttpServletResponse response) throws ioexception{response.setcharacterencoding
		("Utf-8");
		Response.getwriter (). Write ("China");
		Response.setheader ("Content-type", "Text/html;charset=utf-8");
	}

2, directly call the setContentType method in response, this method in addition to setting the client's encoding, it also modifies the response encoding method

	public void Test2 (HttpServletResponse response) throws ioexception{Response.setcontenttype
		("text/html;charset= Utf-8 ");
		Response.getwriter (). Write ("China");
	




Iv. File Downloads

Download steps: 1, get the absolute path of the file. 2. Create a file object through the path. 3, get the input stream of this file object. 4, add the header information <content-disposition> label, tell the client is the way to download the file, not the way to open the file. (SetHeader ("Content-disposition", "attachment;filename" + Name)). 5, get the server output stream, write data to the client, close the file input stream.

public void Download (HttpServletResponse response) throws FileNotFoundException, ioexception{Response.setheader
		("Content-type", "Text/html;charset=utf-8");
		String Realpath = This.getservletcontext (). Getrealpath ("/download/1.gif");
		File File = new file (Realpath);
		OutputStream out = Response.getoutputstream ();
		
		if (!file.exists ()) {
			Out.write ("Sorry, the file has been deleted". GetBytes ("Utf-8"));
			return;
		}
		String filename = realpath.substring (realpath.lastindexof ("\") + 1);
		Response.setheader ("Content-disposition", "attachment;filename=" + filename);
		
		FileInputStream in = new FileInputStream (file);
		int len = 0;
		Byte[] B = new byte[1024];
		
		while ((Len=in.read (b))!=-1) {
			out.write (b, 0, Len);
		}
		In.close ();
	}


This method does not apply to the Chinese filename. If the Chinese file name to go through the URL encoding, if the file name contains spaces, then the URL code will be replaced with the +, so the name in the code to be replaced with%20

public void Download1 (HttpServletResponse response) throws FileNotFoundException, ioexception{
		Response.setheader ("Content-type", "Text/html;charset=utf-8");
		String Realpath = This.getservletcontext (). Getrealpath ("/download/super Mary GIF");
		File File = new file (Realpath);
		OutputStream out = Response.getoutputstream ();
		
		if (!file.exists ()) {
			Out.write ("Sorry, the file has been deleted". GetBytes ("Utf-8"));
			return;
		}
		String filename = realpath.substring (realpath.lastindexof ("\") + 1);
		filename = urlencoder.encode (filename, "utf-8");
		filename = Filename.replaceall ("\\+", "%20");
		Response.setheader ("Content-disposition", "attachment;filename=" + filename);
		
		FileInputStream in = new FileInputStream (file);
		int len = 0;
		Byte[] B = new byte[1024];
		
		while ((Len=in.read (b))!=-1) {
			out.write (b, 0, Len);
		}
		In.close ();
	}


V. Writing Verification Code

Step: 1, create a buffer image in memory

2, get this picture of the graphics Graphics

3. Fill the rectangle with the shape

4. Draw a border on this graphic

5. Draw the jamming line on this graph

6. Draw a string on this graphic

7, use the image stream to write to the client browser

public class Validatepic extends HttpServlet {private static final int WIDTH = 130;

	private static final int HEIGHT = 30; public void doget (HttpServletRequest request, httpservletresponse response) throws Servletexception, IOException {/
		/Create a picture in memory bufferedimage image = New BufferedImage (WIDTH, HEIGHT, Bufferedimage.type_int_rgb);
		Get this memory graph Graphics g = image.getgraphics ();
		Filled rectangular background setbgcolor (g);
		Draw a rectangular border drawrect (g);
		Draw Disturbing line drawLine (g);

		Draw Text drawstring ((graphics2d) g);
		Writes the browser response.setcontenttype ("Image/gif") with the picture IO stream;
		Response.setdateheader ("Expries",-1);
		Response.setheader ("Pragma", "No-cache");
		Response.setheader ("Cache-control", "No-cache");
		Imageio.write (image, "gif", Response.getoutputstream ());
	G.dispose ();
		public void DrawRect (Graphics g) {G.setcolor (color.red);
	G.drawrect (1, 1, WIDTH-2, HEIGHT-2);
		public void Setbgcolor (Graphics g) {G.setcolor (color.yellow); G.fillrect (0, 0, WIDTH, HEIGHT);
			} public void DrawLine (Graphics g) {for (int i = 0; i < 7; i++) {int x = new Random (). Nextint (WIDTH);

			int y = new Random (). Nextint (HEIGHT);
			int x1 = new Random (). Nextint (WIDTH);

			int y1 = new Random (). Nextint (HEIGHT);
		G.drawline (x, y, x1, y1); } public void DrawString (graphics2d g) {String words = ' \u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u67 09\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3 \u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\ U53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\ U9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\ U56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\ U547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\ u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\ U5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\ U7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\ U5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\ U4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\ U6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\ U77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\ U96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\ U6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\ U4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\ U611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\ U5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\ u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\ u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\ U5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\ U5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\ U7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\ u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55 \u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\
		U62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6 ";
		int x = 10;
			for (int i = 0; i < 4; i++) {Char word = Words.charat (new Random (). Nextint (Words.length ()));
			G.setfont (New Font ("Official script", Font.Bold, 20));
			
			G.setcolor (Color.Blue);
			int degree = new Random (). Nextint ()%30;
			G.rotate (degree*math.pi/180,x,20);
			
			g.DrawString (word+ "", X, 20);
			G.rotate (-degree*math.pi*180,x,20);
		x = x + 30; }
	}
}


Six, timed refresh (browser login jump, forum posts refresh)

HTTP timed-Refreshed message headers: "Refresh", "3"

public class Refresh extends HttpServlet {public

	void doget (HttpServletRequest request, HttpServletResponse Response)
			throws Servletexception, IOException {

		response.setheader ("Refresh", "3");
		int num = new Random (). Nextint ();
		Response.getwriter (). Write (num+ "");


private void Director (HttpServletResponse response) {
		Response.setheader ("Refresh", "2;url=/day05/index.jsp");
	}

Usually we do not jump the page like this, we will place the message inside the domain object, bring the JSP to the display layer and then add in the JSP <meta> tag

<meta equiv= "Refresh" content= "3";/project/index.jsp>

Seven, let the browser cache data

We can add "expires" to the response message header, System.currenttimemillis () + 3600*1000 Note that the current system milliseconds plus the cache time

Eight, response request redirection

Request redirection means that when a Web resource receives a client request, it notifies the client that it should access another Web resource, which is the request redirection. One request redirection needs to be like a server sending two requests, and the address bar has changed, and the application scene is more user logged in.

1, Response.sendredirect () Implementation request redirection

public void doget (HttpServletRequest request, httpservletresponse response)
			throws Servletexception, IOException {
		response.sendredirect ("/day05/index.jsp");
	}


2, 302 status Code and Location header implementation request redirection

public void doget (HttpServletRequest request, httpservletresponse response)
			throws Servletexception, IOException {
		Response.setstatus (302);
		Response.setheader ("Location", "/day05/index.jsp");
	}


Request Redirection Process:

1, the browser to send a request to the server

2, the server received the request, if it is the first access will create a new Servlet

3. Call the Servlet's service () method (ready to request and response objects before calling)

4, in the service () run to the response to write data, write to the response as Sendredirect () command

5, Service () method after the completion of the return to the server

6, the server found in the response 302 and location, so the 302 and location to the browser

7, the browser received 302 and location, and then to find resources, send the request again

8, the server and then find a second Servlet

9, the server also prepares a request and response object

10, the server then calls the second service () method

11, Service () method returned to the server information

12, the server will return information to the browser

Ix. details in the response

1, Getoutputstream and Printwiter two methods are rejected, call a method can not call another

2, Getoutputstream and Printwiter write the data is written in the response inside, in the response inside a byte array of buffers, and then the server from the response to get data back to the browser

3, we generally do not manually shut down Getoutputstream and Printwiter, because after the server calls the service (), will check that these two streams have not been closed, if not, it will automatically shut down.

Ten, HttpServletRequest objects

1, the HttpServletRequest object represents the client's request, when the client accesses the server through the HTTP protocol, all the information in the HTTP request is encapsulated in this object (saved with HashMap).

HTTP request by: Request row, request header, request data. Composed of three parts

(1), the request line includes: Request the way, request the resource, adopt the Protocol (get/aa/1.html http/1.1)

Request.getmethod ()---Get request method

Request.geturi ()---Get the requested resource (URI: Locate resource, URL: Locate resources on the Internet)

(2), there are several ways to get the request header

(3), there are several methods to obtain request data, where the MAP value obtained in Getparamatersmap () is a String array, Getinpustream can be returned to the server as a stream, as a file upload

2. Common request headers in HTTP

Host, Accept, Cookie, Connection, Pragma, accept-encoding, Content-length, refere ...

Xi. Anti-theft chain

public void doget (HttpServletRequest request, httpservletresponse response)
			throws Servletexception, IOException {

		String from = Request.getparameter ("Referer");
		
		if (from!= null | |!from.startswith ("/project/index.jsp")) {
			response.sendredirect ("/project/index.jps");
			return;
		}
		System.out.println (".........")
	


12, request submits the data the garbled question

1. When submitting by post, the browser first converts the Chinese characters into the current character encoding of the browser and submits them to the server in the byte buffer of request, and when we use Request.getparamater (), the request will be based on Iso8859-1 encode the byte to decode, so there will be garbled. It is willing, because the request with the wrong code table, resulting in the inability to parse the characters normally, so we only need request.setcharacterencoding ("..."); Can. This means that the request must be encoded in accordance with the client's browser when decoding.

2, when using Get method submission, because get submitted data, its data is in the address bar can be displayed, so get submitted data will be URL encoding, URL will be iso8859-1 way to encode, when passed to the server when the object of the request, and then in GE Tparamater () is tantamount to using iso8859-1 to encode Chinese, even if the request encoding is specified, it is no use. Because the iso8859-1 is decoded with other encodings, the corresponding Chinese characters are still not found, so we should encode the character data in a iso8859-1 way, then we get the raw data that the client passes over and then decode it in other ways. The correct way should be:

String username = new String ((Request.getparamater ("username"). GetBytes ("Iso8859-1")), "Utf-8");

13, the WEB project address access to write hair

If this address is for the browser, then/on behalf of your host, is representative of the site, if the address is for the server, then/represents the current Web application. is based on the principle of who is using the goal. On behalf of the host, you can access directly through/index.jsp, if the Representative browser is/project/index.jsp

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.