Web Foundation - Servlet&HTTP&Request

Keywords: Java SQL encoding Database

Article Directory

Servlet:

1. Concepts
 2. Steps
 3. Principle of execution
 4. Life cycle
 5. Servlet3.0 Annotation Configuration
 6. Architecture of Servlet	
	Servlet--Interface
		|
	GenericServlet -- Abstract Class
		|
	HttpServlet -- Abstract Class

	* GenericServlet: Default empty implementation of other methods in the Servlet interface, using only the service() method as abstraction
		*When defining a Servlet class in the future, you can inherit the GenericServlet and implement the service() method

	* HttpServlet: An encapsulation of the http protocol to simplify operations
		1. Definition class inherits HttpServlet
		2. Override doGet/doPost method

7. Servlet-related configuration
	1. urlpartten:Servlet access path
		1.A Servlet can define multiple access paths: @WebServlet ({'/d4', /dd4', /ddd4'})
		2. Path Definition Rules:
			1. /xxx: path matching
			2. /xxx/xxx: Multilayer Path, Directory Structure
			3. *.do: Extension matching

HTTP:

* Concepts: Hyper Text Transfer Protocol Hyper Text Transfer Protocol
	* Transport protocol: Defines the format in which data is sent when communicating between client and server
	* Characteristic:
		1. Be based on TCP/IP Advanced Agreements
		2. Default port number:80
		3. Request-based/Response model:One request corresponds to one response
		4. Stateless: Each request is independent of each other and cannot interact with data

	* Historical Version:
		* 1.0: Each request response establishes a new connection
		* 1.1: Multiplex connection

* Request message data format
	1. Request line
		//Request mode request url request protocol/version
		GET /login.html	HTTP/1.1

		* Request method:
			* HTTP The protocol has 7 request modes, and there are 2 commonly used
				* GET: 
					1. Request parameters are in the request line, in the url After.
					2. Requested url Limited length
					3. Not very safe
				* POST: 
					1. Request parameters in request body
					2. Requested url Unlimited length
					3. Relative Security
	2. Request header: Client browser tells server some information
		//Request Header Name: Request Header Value
		* Common request headers:
			1. User-Agent: The browser tells the server that I access the version information of the browser you are using
				* This header can be retrieved on the server side to resolve browser compatibility issues

			2. Referer: http://localhost/login.html
				* Tell the server, I(Current Request)Where do you come from?
					* Effect:
						1. Anti-theft chain:
						2. Statistics:
	3. Request blank lines
		//An empty line is the request header used to split the POST request and the request body.
	4. Requestor(text): 
		* encapsulation POST Request parameter of the request message

	* String format:
		POST /login.html	HTTP/1.1
		Host: localhost
		User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
		Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
		Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
		Accept-Encoding: gzip, deflate
		Referer: http://localhost/login.html
		Connection: keep-alive
		Upgrade-Insecure-Requests: 1
		
		username=zhangsan	


* Response message data format

Request:

1. Principles of request and response objects
	1. request and response objects are created by the server.Let's use them
	2. The request object is to get the request message, and the response object is to set the response message

2. request object inheritance architecture:	
	ServletRequest -- Interface
		| Inheritance
	HttpServletRequest -- Interface
		| Implementation
	org.apache.catalina.connector.RequestFacade class (tomcat)

3. request function:
	1. Get request message data
		1. Get request row data
			* GET /day14/demo1?name=zhangsan HTTP/1.1
			*Method:
				1. Get Request Method: GET
					* String getMethod()  
				2. (*) Get virtual directory: /day14
					* String getContextPath()
				3. Get Servlet Path: /demo1
					* String getServletPath()
				4. Get get mode request parameter: name=zhangsan
					* String getQueryString()
				5. (*) Get request URI:/day14/demo1
					* String getRequestURI():		/day14/demo1
					* StringBuffer getRequestURL()  :http://localhost/day14/demo1

					* URL: Uniform Resource Locator: http://localhost/day14/demo1 People's Republic of China
					* URI: Uniform Resource Identifier: /day14/demo1 Republic
				
				6. Get protocol and version: HTTP/1.1
					* String getProtocol()

				7. Get the IP address of the client:
					* String getRemoteAddr()
				
		2. Get request header data
			*Method:
				* (*) String getHeader(String name): Get the value of the request header by its name
				* Enumeration <String> getHeaderNames(): Get all request header names
			
		3. Get the requester data:
			*Request body: Only POST request mode can have a request body, which encapsulates the request parameters of a POST request
			*Step:
				1. Get Stream Objects
					* BufferedReader getReader(): Gets the character input stream and can only operate on character data
					* ServletInputStream getInputStream(): Gets a byte input stream that can operate on all types of data
						*Explain after uploading knowledge points

				2. Retrieve data from streaming objects
			
			
	2. Other functions:
		1. The common way to get request parameters: either get or post request can use the following methods to get request parameters
			1. String getParameter(String name): Get the parameter value username=zs&password=123 based on the parameter name
			2. String[] getParameterValues(String name): Array hobby=xx&hobby=game that gets the parameter value from the parameter name
			3. Enumeration <String> getParameterNames(): Get parameter names for all requests
			4. Map<String, String[]> getParameterMap(): Get a map collection of all parameters

			*Chinese scrambling problem:
				* get mode: tomcat 8 has solved the get mode scrambling problem
				* post mode: scrambling
					*Resolution: Set request's encoding request.setCharacterEncoding("utf-8") before getting parameters;
		
				
		2. Request Forwarding: A resource jump within the server
			1. Steps:
				1. Get the request forwarder object from the request object: RequestDispatcher getRequestDispatcher(String path)
				2. Use the RequestDispatcher object to forward: forward(ServletRequest request, ServletResponse response) 

			2. Features:
				1. Browser address bar path does not change
				2. Can only be forwarded to current server internal resources.
				3. Forwarding is a request


		3. Sharing data:
			*Domain object: A scoped object that can share data within a scope
			* Request domain: Represents the scope of a single request and is typically used to share data among multiple resources for request forwarding
			*Method:
				1. void setAttribute(String name,Object obj): Store data
				2. Object getAttitude(String name): Get value by key
				3. void removeAttribute(String name): Remove key-value pairs by key

		4. Get the ServletContext:
			* ServletContext getServletContext()

Case: User Login

* User Logon Case Requirements:
	1.To write login.html Logon Page
		username & password Two input boxes
	2.Use Druid Database Connection Pool Technology,operation mysql,day14 Database user surface
	3.Use JdbcTemplate Technology Packaging JDBC
	4.Login successfully jumped to SuccessServlet Show: Sign in successfully!User name,Welcome
	5.Logon Failure Jump to FailServlet Show: Logon failure, incorrect username or password


* Analysis

* Development steps
	1. Create project, import html Page, Profile, jar package
	2. Create a database environment
		CREATE DATABASE day14;
		USE day14;
		CREATE TABLE USER(
		
			id INT PRIMARY KEY AUTO_INCREMENT,
			username VARCHAR(32) UNIQUE NOT NULL,
			PASSWORD VARCHAR(32) NOT NULL
		);

	3. create package cn.itcast.domain,Create Class User
		package cn.itcast.domain;
		/**
		 * User's Entity Class
		 */
		public class User {
		
		    private int id;
		    private String username;
		    private String password;
		
		
		    public int getId() {
		        return id;
		    }
		
		    public void setId(int id) {
		        this.id = id;
		    }
		
		    public String getUsername() {
		        return username;
		    }
		
		    public void setUsername(String username) {
		        this.username = username;
		    }
		
		    public String getPassword() {
		        return password;
		    }
		
		    public void setPassword(String password) {
		        this.password = password;
		    }
		
		    @Override
		    public String toString() {
		        return "User{" +
		                "id=" + id +
		                ", username='" + username + '\'' +
		                ", password='" + password + '\'' +
		                '}';
		    }
		}
	4. create package cn.itcast.util,Writing tool classes JDBCUtils
		package cn.itcast.util;

		import com.alibaba.druid.pool.DruidDataSourceFactory;
		
		import javax.sql.DataSource;
		import javax.xml.crypto.Data;
		import java.io.IOException;
		import java.io.InputStream;
		import java.sql.Connection;
		import java.sql.SQLException;
		import java.util.Properties;
		
		/**
		 * JDBC Tool class uses Durid connection pool
		 */
		public class JDBCUtils {
		
		    private static DataSource ds ;
		
		    static {
		
		        try {
		            //1. Load Profile
		            Properties pro = new Properties();
		            //Load the configuration file using ClassLoader to get the byte input stream
		            InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
		            pro.load(is);
		
		            //2. Initialize connection pool objects
		            ds = DruidDataSourceFactory.createDataSource(pro);
		
		        } catch (IOException e) {
		            e.printStackTrace();
		        } catch (Exception e) {
		            e.printStackTrace();
		        }
		    }
		
		    /**
		     * Get Connection Pool Object
		     */
		    public static DataSource getDataSource(){
		        return ds;
		    }
		
		
		    /**
		     * Get Connection Object
		     */
		    public static Connection getConnection() throws SQLException {
		        return  ds.getConnection();
		    }
		}
	5. create package cn.itcast.dao,Create Class UserDao,provide login Method
		
		package cn.itcast.dao;

		import cn.itcast.domain.User;
		import cn.itcast.util.JDBCUtils;
		import org.springframework.dao.DataAccessException;
		import org.springframework.jdbc.core.BeanPropertyRowMapper;
		import org.springframework.jdbc.core.JdbcTemplate;
		
		/**
		 * Classes that operate on User tables in the database
		 */
		public class UserDao {
		
		    //Declare JDBCTemplate object sharing
		    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
		
		    /**
		     * Login Method
		     * @param loginUser User name and password only
		     * @return user Contains all user data, not queried, returns null
		     */
		    public User login(User loginUser){
		        try {
		            //1. Write sql
		            String sql = "select * from user where username = ? and password = ?";
		            //2. Call query method
		            User user = template.queryForObject(sql,
		                    new BeanPropertyRowMapper<User>(User.class),
		                    loginUser.getUsername(), loginUser.getPassword());
		
		
		            return user;
		        } catch (DataAccessException e) {
		            e.printStackTrace();//Logging
		            return null;
		        }
		    }
		}
	
	6. To write cn.itcast.web.servlet.LoginServlet class
		package cn.itcast.web.servlet;

		import cn.itcast.dao.UserDao;
		import cn.itcast.domain.User;
		
		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;
		
		
		@WebServlet("/loginServlet")
		public class LoginServlet extends HttpServlet {
		
		
		    @Override
		    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		        //1. Set up encoding
		        req.setCharacterEncoding("utf-8");
		        //2. Get Request Parameters
		        String username = req.getParameter("username");
		        String password = req.getParameter("password");
		        //3. Encapsulate user objects
		        User loginUser = new User();
		        loginUser.setUsername(username);
		        loginUser.setPassword(password);
		
		        //4. Call UserDao's login method
		        UserDao dao = new UserDao();
		        User user = dao.login(loginUser);
		
		        //5. Judging user
		        if(user == null){
		            //Logon Failure
		            req.getRequestDispatcher("/failServlet").forward(req,resp);
		        }else{
		            //Login Successful
		            //Store data
		            req.setAttribute("user",user);
		            //Forward
		            req.getRequestDispatcher("/successServlet").forward(req,resp);
		        }
		
		    }
		
		    @Override
		    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		        this.doGet(req,resp);
		    }
		}

	7. To write FailServlet and SuccessServlet class
		@WebServlet("/successServlet")
		public class SuccessServlet extends HttpServlet {
		    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        //Get the shared user object in the request domain
		        User user = (User) request.getAttribute("user");
		
		        if(user != null){
		            //Write a sentence to the page
		
		            //Set Encoding
		            response.setContentType("text/html;charset=utf-8");
		            //output
		            response.getWriter().write("Login successful!"+user.getUsername()+",Welcome");
		        }
		
		
		    }		


		@WebServlet("/failServlet")
		public class FailServlet extends HttpServlet {
		    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        //Write a sentence to the page
		
		        //Set Encoding
		        response.setContentType("text/html;charset=utf-8");
		        //output
		        response.getWriter().write("Logon failure, incorrect username or password");
		
		    }
		
		    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		        this.doPost(request,response);
		    }
		}



	8. login.html in form Form's action Writing Path
		* Virtual Directory+Servlet Resource Path

	9. BeanUtils Tool class to simplify data encapsulation
		* For encapsulation JavaBean Of
		1. JavaBean: Standard Java class
			1. Requirement:
				1. Class must be public Modification
				2. Constructors that must provide empty parameters
				3. Member variables must be used private Modification
				4. Provide Public setter and getter Method
			2. Function: Encapsulate data


		2. Concepts:
			//Member variables:
			//Attribute: The product intercepted by setter and getter methods
				//For example: getUsername () --> Username --> username


		3. Method:
			1. setProperty()
			2. getProperty()
			3. populate(Object obj , Map map):take map The key-value pair information of the collection, encapsulated in the corresponding JavaBean In object
69 original articles were published. 1. Visits 2558
Private letter follow

Posted by Gordonator on Wed, 22 Jan 2020 19:12:20 -0800