Javaweb-Servlet进阶

Servlet的体系结构

Servlet – 接口

  1. GenericServlet – 抽象类

  2. HttpServlet – 抽象类:对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

代码范例

项目结构

在这里插入图片描述

核心代码

servlet类

@WebServlet("/sunny")
public class HttpServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("this is get method");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("this is post method ");
    }
}

index.jsp代码

<%--
  Created by IntelliJ IDEA.
  User: Zsy
  Date: 2020/7/29
  Time: 17:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
<form action="sunny" method="post">
  <input name="username" type="text">
  <input name="password" type="text">
  <input type="submit" value="push">
</form>
  </body>
</html>

http协议

概述

Hyper Text Transfer Protocol 超文本传输协议

作用

规范了客户端和服务端互相发送数据的格式

特点:

	1. 基于TCP/IP的高级协议
	2. 默认端口号:80
	3. 基于请求/响应模型的:一次请求对应一次响应
	4. 无状态的:每次请求之间相互独立,不能交互数据

历史版本

	* 1.0:每一次请求响应都会建立新的连接
	* 1.1:复用连接

请求消息数据格式

请求行

包含 :请求方式(GET ) 请求url(/login.html) 请求协议/版本(HTTP/1.1)

请求方式

		* HTTP协议有7中请求方式,常用的有2种
			* GET:
				1. 请求参数在请求行中,在url后。
				2. 请求的url长度有限制的
				3. 不太安全
			* POST:
				1. 请求参数在请求体中
				2. 请求的url长度没有限制的
				3. 相对安全

请求头 (客户端浏览器告诉服务器一些信息)

格式

请求头名称: 请求头值

常见的请求头:

		1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
			* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题

		2. Referer:http://localhost/login.html
			* 告诉服务器,当前请求从哪里来?
				* 作用:
					1. 防盗链:
					2. 统计工作:

请求空行

	空行,就是用于分割POST请求的请求头,和请求体的。

4. 请求体(正文)

	* 封装POST请求消息的请求参数的
	* 字符串格式:
	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	

refer

在这里插入图片描述

request内置对象

request对象和response对象的原理

  1. request和response对象是由服务器创建的。我们来使用它们
  2. request对象是来获取请求消息,response对象是来设置响应消息

主要功能

方法概述

1. 获取请求消息数据
	1. 获取请求行数据
		* GET /day14/demo1?name=zhangsan HTTP/1.1
		* 方法:
			1. 获取请求方式 :GET
				* String getMethod()  
			2. (*)获取虚拟目录:/day14
				* String getContextPath()
			3. 获取Servlet路径: /demo1
				* String getServletPath()
			4. 获取get方式请求参数:name=zhangsan
				* String getQueryString()
			5. (*)获取请求URI:/day14/demo1
				* String getRequestURI():		/day14/demo1
				* StringBuffer getRequestURL()  :http://localhost/day14/demo1

				* URL:统一资源定位符 : http://localhost/day14/demo1	和URI作类比,URL相当于中华人民共和国
				* URI:统一资源标识符 : /day14/demo1					URI相当于共和国,范围更大
			
			6. 获取协议及版本:HTTP/1.1
				* String getProtocol()

			7. 获取客户机的IP地址:
				* String getRemoteAddr()
			
	2. 获取请求头数据
		* 方法:
			* (*)String getHeader(String name):通过请求头的名称获取请求头的值
			* Enumeration<String> getHeaderNames():获取所有的请求头名称
		
	3. 获取请求体数据:
		* 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
		* 步骤:
			1. 获取流对象
				*  BufferedReader getReader():获取字符输入流,只能操作字符数据
				*  ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
					* 在文件上传知识点后讲解

			2. 再从流对象中拿数据


2. 其他功能:
	1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
		1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=123
		2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game
		3. Enumeration<String> getParameterNames():获取所有请求的参数名称
		4. Map<String,String[]> getParameterMap():获取所有参数的map集合

		* 中文乱码问题:
			* get方式:tomcat 8 已经将get方式乱码问题解决了
			* post方式:会乱码
				* 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

代码范例

获取各种参数

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
            1. 获取请求方式 :GET
                * String getMethod()
            2. (*)获取虚拟目录:/day14
                * String getContextPath()
            3. 获取Servlet路径: /requestDemo1
                * String getServletPath()
            4. 获取get方式请求参数:name=zhangsan
                * String getQueryString()
            5. (*)获取请求URI:/day14/demo1
                * String getRequestURI():		/day14/requestDemo1
                * StringBuffer getRequestURL()  :http://localhost/day14/requestDemo1
            6. 获取协议及版本:HTTP/1.1
                * String getProtocol()

            7. 获取客户机的IP地址:
                * String getRemoteAddr()

         */
        //1. 获取请求方式 :GET
        String method = request.getMethod();
        System.out.println(method);
        //2.(*)获取虚拟目录:/day14
        String contextPath = request.getContextPath();
        System.out.println(contextPath);
        //3. 获取Servlet路径: /demo1
        String servletPath = request.getServletPath();
        System.out.println(servletPath);
        //4. 获取get方式请求参数:name=zhangsan
        String queryString = request.getQueryString();
        System.out.println(queryString);
        //5.(*)获取请求URI:/day14/demo1
        String requestURI = request.getRequestURI();
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURI);
        System.out.println(requestURL);
        //6. 获取协议及版本:HTTP/1.1
        String protocol = request.getProtocol();
        System.out.println(protocol);
        //7. 获取客户机的IP地址:
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
    }

获取请求头数据

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

        Enumeration<String> headerNames = req.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String header = headerNames.nextElement();
            System.out.println(req.getHeader(header));
        }
    }

通过集合方式获取请求参数

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

        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<String> keySet = parameterMap.keySet();

        for (String key : keySet) {

            String res=String.format("key:%s  value:%s",key,parameterMap.get(key)[0]);
            System.out.println(res);
        }

    }
2. 其他功能:
	1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
		1. String getParameter(String name):根据参数名称获取参数值    username=zs&password=123
		2. String[] getParameterValues(String name):根据参数名称获取参数值的数组  hobby=xx&hobby=game
		3. Enumeration<String> getParameterNames():获取所有请求的参数名称
		4. Map<String,String[]> getParameterMap():获取所有参数的map集合

中文乱码问题:

			* get方式:tomcat 8 已经将get方式乱码问题解决了
			* post方式:会乱码
				* 解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
 @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        System.out.println("this is post method ");
        System.out.println(req.getParameter("username"));
    }

请求转发

		1. 步骤:
			1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
			2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 

		2. 特点:
			1. 浏览器地址栏路径不发生变化
			2. 只能转发到当前服务器内部资源中。
			3. 转发是一次请求

代码范例

@WebServlet("/sunny")
public class HttpServletDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.getRequestDispatcher("/shark").forward(req,resp);
    }

   
}

@WebServlet("/shark")
public class HttpServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("/shark get"+req.getParameter("username"));
    }

   
}

综合案例

需求

编写一个login.html,用该页面提交用户名和密码
查询数据库是否存在,若存在则用request存用户数据并跳转到successSevlet,若失败则调换到failServlet

需求图解

在这里插入图片描述

项目结构

在这里插入图片描述

核心代码

实体层

package com.demo.domain;

/**
 * Created by Zsy on 2020/7/29.
 */
public class User {
    private int id;
    private String username;
    private String password;

    private String gender;

    public void setHehe(String gender){
        this.gender = gender;
    }

    public String getHehe(){
        return gender;
    }

    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 + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

dao层

package com.demo.dao;

import com.demo.domain.User;
import com.demo.util.JDBCUtil;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

/**
 * Created by Zsy on 2020/7/29.
 */
public class UserDao {
    private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtil.getDataSource());

    public User findUser(User loginUser) {
        User user = null;
        try {
            String sql="select * from user where username=? and password =?";
            user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class)
                    , loginUser.getUsername(), loginUser.getPassword()
            );
        } catch (DataAccessException e) {
            e.printStackTrace();
            return null;
        }
        return user;
    }
}

测试

package com.demo.test;

import com.demo.dao.UserDao;
import com.demo.domain.User;
import com.sun.org.glassfish.external.arc.Taxonomy;
import org.junit.Test;

/**
 * Created by Zsy on 2020/7/29.
 */
public class UserDaoTest {

    @Test
    public void findUser(){
        User user=new User();
        user.setUsername("jack");
        user.setPassword("121314");

        UserDao userDao=new UserDao();
        User user1 = userDao.findUser(user);

        if (user1!=null)
            System.out.println("success");
    }
}

工具层

package com.demo.util;



import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;


import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * Created by Zsy on 2020/7/29.
 */
public class JDBCUtil {
    private static DataSource dataSource;

    static {
        try {
            Properties properties=new Properties();
            InputStream inputStream=JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(inputStream);

            //2.初始化连接池对象
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }

    }



    /**
     * 获取连接池对象
     */
    public static DataSource getDataSource(){
        return dataSource;
    }


    /**
     * 获取连接Connection对象
     */
    public static Connection getConnection() throws SQLException {
        return  dataSource.getConnection();
    }
}

servlet

package cn.itcast.web.servlet;

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("/successServlet")
public class SuccessServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取request域中共享的user对象
        User user = (User) request.getAttribute("user");

        if(user != null){
            //给页面写一句话

            //设置编码
            response.setContentType("text/html;charset=utf-8");
            //输出
            response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");
        }


    }

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

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/day14_test/loginServlet" method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"><br>

        <input type="submit" value="登录">

    </form>
</body>
</html>
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页