本例结构图
文章目录
maven项目的pom.xml
本例中我忘了修改标签内容,所以访问路径就变成之前项目的路径Tomcat_App了
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Tomcat_App</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>18</maven.compiler.source>
<maven.compiler.target>18</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
</dependencies>
<!--tomcat plugin-->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!--<configuration>
<path>/Tomcat_App</path>
</configuration>-->
</plugin>
</plugins>
</build>
</project>
本例用到的html,修改action属性,分别提交给各个servlet
修改method,分别测试GET,和POST提交方式,查看servlet中的doGet和doPost正常对应
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test for request</title>
</head>
<body>
<form action="/Tomcat_App/req3" method="get">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="checkbox" name="Hobby" value="1">Movie
<input type="checkbox" name="Hobby" value="2">Music <br>
<input type="submit">
</form>
</body>
</html>
文章目录
request对象的servlet类
第一个
package com.diy.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
/**
* request object methods
*/
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String getMethod(); get the request ways : GET
String method = req.getMethod();
System.out.println(method);
//String getContextPath(); get virtual directory : /Tomcat_App
String contextPath = req.getContextPath();
System.out.println(contextPath);
//StringBuffer getRequestURL(); get URL : http://localhost:8080/Tomcat_App/req1
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
//String getRequestURI(); get URI : /Tomcat_App/req1
String requestURI = req.getRequestURI();
System.out.println(requestURI);
/**
* String getQueryString(); get request parameters : username=zhang&password=1234
* the doGet method don't need to get request body, the GET way don't have request body
* just the QueryString is enough
*/
String queryString = req.getQueryString();
System.out.println(queryString);
System.out.println("========Divide line=======");
//get request header, like user-agent , info about the browser
String header = req.getHeader("user-agent");
System.out.println(header);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* get request body, the body only post ways has,
* and there two methods for get them, one for the char contents, one for the byte contents
* here we demonstrate only use a char contents included html
*/
//1.create a char input stream
BufferedReader br = req.getReader();
//2.read data
String line = br.readLine();
System.out.println(line);
}
}
第二个
package com.diy.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Map;
/**
* Use generic method to get the request parameters
* the method of doGet is req.getQueryString()
* the method of doPost is getReader() for char contents
* getInputStream() for byte contents
* here we like to use one way solve both of doGet and doPost
*/
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//here we start from GET way
// System.out.println("GET way ~~~");
//1.First step of generic method is get Map of all parameters
Map<String, String[]> parameterMap = req.getParameterMap();
for (String key : parameterMap.keySet()) {
//for one key one value, like username=zhang
System.out.print(key + ":");
//get values, all the values is a String[], regardless it's only one value or more
String[] strings = parameterMap.get(key);
for (String string : strings) {
System.out.print(string + " ");
}
System.out.println();// enter to next line
}
//2.get values by key
System.out.println("======divide line=======");
String[] hobbies = req.getParameterValues("Hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//3.get value by key
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 {
this.doGet(req, resp);
}
}
乱码解决思路
package com.diy.web.request;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
public class URL_EncodingDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String name = "美咲";
//encoding
String enc = URLEncoder.encode(name, "utf-8");
System.out.println(enc);
//decoding
// String dec = URLDecoder.decode(enc, "utf-8");
String dec = URLDecoder.decode(enc, "iso-8859-1");
System.out.println(dec);
//convert dec to byte data
byte[] bytes = dec.getBytes(StandardCharsets.ISO_8859_1);
for (byte aByte : bytes) {
System.out.print(aByte +" ");
}
System.out.println();
//convert to String
String rs = new String(bytes, "utf-8");
System.out.println(rs);
}
}
第三个,解决乱码
package com.diy.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
* before Tomcat 8, request data include 中文 submitting will occur garbled char
*/
@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
if ("POST".equals(method)) {
//when request way is post, put this before req.getParameter() can solve the char garble
req.setCharacterEncoding("utf-8");
//through 中文 username demonstrate the char garble, attention it is a generic method, can be used by doPost
String username = req.getParameter("username");
System.out.println(username);
}else if ("GET".equals(method)) {
/**
* Solve the problem in GET
* char garble cause: the GET way request put parameter in URL, encoding by utf-8, by browser
* but when tomcat receive this URL, it decodes URL by iso-8859-1
* you can also write them as one line
* String rs = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
*/
//1.convert garbled char to bytes
String username = req.getParameter("username");
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
//2.create String by bytes, by utf-8
String rs = new String(bytes,StandardCharsets.UTF_8);
System.out.println(rs);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
第四个
package com.diy.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* Request forwarding
*/
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("here is demo4 ~~~~");
//storage data in request object
req.setAttribute("msg","hello~~~");
//forwarding, just one line code
req.getRequestDispatcher("/req5").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
第五个
package com.diy.web.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Use generic method to get the request parameters
* the method of doGet is req.getQueryString()
* the method of doPost is getReader() for char contents
* getInputStream() for byte contents
* here we like to use one way solve both of doGet and doPost
*/
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("here is demo5 ~~~~");
Object msg = req.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
第六个,用idea模板生成的servlet
package com.diy.web.request;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
/**
* this servlet is created by diy servlet template
*/
@WebServlet("/ServByTemplate1")
public class ServletByTemplate1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
文章目录
response部分
第一个
package com.diy.web.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Redirect by response object
*/
@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("response demo 1 ~~~");
// //1.redirect first step, response status number 302
// resp.setStatus(302);
/**
* 2.response one of headers, location, when the address offer to browser,
* you need this /Tomcat_App, it called virtual directory
*/
// resp.setHeader("location","/Tomcat_App/resp2");
//3.We can also use a simpler way
// resp.sendRedirect("/Tomcat_App/resp2");
// resp.sendRedirect("https://www.google.com/");
//4.get virtual directory by dynamic, after you set the virtual directory in pom.xml
String contextPath = req.getContextPath();
resp.sendRedirect(contextPath+"/resp2");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
第二个
package com.diy.web.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* Redirect from demo1
*/
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("response demo 2 ~~~");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
第三个
package com.diy.web.response;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
/**
* create char output stream by response object
*/
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//when you like to resp at line 34, do this at first, and comment out line 25
resp.setContentType("text/html;charset=utf-8");
//1.get a char output stream , through response object
PrintWriter wr = resp.getWriter();
//if you like to response a html, set header previously
// resp.setHeader("content-type","text/html");
wr.write("abcd");
wr.write("<h1>ABCD<h1>");
/**
* when you like to response 中文, you should care about the char garbling
*
* the output stream create by resp no need to close, when tomcat destroy the whole servlet , it will close it
*/
wr.write("美咲");
wr.write("<h2>こんちは<h2>");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
第四个,此处用到的图片,自行准备
package com.diy.web.response;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* create byte output stream by response object
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* there's two ways, by while method, or by IOUtils.copy
* and you don't need to close resp output stream, the tomcat do that when necessary
*/
//1.first read the byte file
FileInputStream fileIn = new FileInputStream("src\\Files\\Misaki.jpg");
//2.create resp output stream
ServletOutputStream ops = resp.getOutputStream();
//3.copy from file read stream, and output by resp
// byte[] buff = new byte[1024 * 10];//10kb per time
// int vol = 0;// when all bytes be read, and there is no byte last ,will return -1, don't forget
// while ((vol = fileIn.read(buff)) != -1) {
// ops.write(buff,0,vol);
// }
/**
* the way we copy file read stream to resp output stream is so many work
* we can make it simpler, you should import a dependency tag in pom.xml, named commons-io
* then you can do the same work, by just this
*/
IOUtils.copy(fileIn,ops);
fileIn.close();//only close this stream
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}