4. HttpServletRequest、HttpServletResponse

1 HttpServletRequest

  1. HttpServletRequest用来存放客户端请求的参数,而请求包括请求行、请求头、请求体
1.1 获取请求行中信息
//1. 获取请求的方法:GET
String getMethod();
//2. 获取请求的完整地址:http://localhost:8080/myfirstServlet/HelloWorld
StringBuffer getRequestURL();
//3. 获取请求中的资源路径:/myfirstServlet/HelloWorld
String getRequestURI();
//4. 获取请求中的协议:http
String getScheme();
1.2 获取请求头中信息
//1. 根据key获取value的值:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
String getHeader(String var1);
//2. 获取请求头信息中,所有的key值的集合,Enumeration为老式的迭代器
Enumeration<String> getHeaderNames();
Enumeration<String> headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
    String s = headerNames.nextElement();
    System.out.println(headerNames.nextElement()+":"+req.getHeader(s));
}
1.3 获取用户请求数据
  1. 对于GET请求,数据会放在请求行里,对于POST请求,数据放在请求体里,但获取他们的方式相同
//1. 获取用户请求数据
	//对于GET请求,var1值,要和url中?后属性名相同
	//对于POST请求,var1值,要和form表单中input标签中的name属性值相同
String getParameter(String var1);
//2. 向request属性中赋值
setAttribute(String var1, Object var2)
//3. 获取request中属性值
getAttribute(String var1)
//4. 获取用户数据的所有key
Enumeration<String> getParameterNames();
//5. 获取相同key的多个数据值,例如checkbox
String[] getParameterValues(String var1);
//checkbox示例,同一个name,对应多个value
<input type="checkbox" name="val" value="1">java
<input type="checkbox" name="val" value="2">c#
<input type="checkbox" name="val" value="3">go
1.4 其他常用方法
//1. 获取远程客户端地址:127.0.0.1
String getRemoteAddr();
//2. 获取远程客户端主机名:127.0.0.1
String getRemoteHost();
//3. 获取远程客户端端口号:2463
int getRemotePort();
//4. 获取服务端地址:127.0.0.1
String getLocalAddr();
//5. 获取服务端主机名:DESKTOP-HRHE4K0
String getLocalName();
//6. 获取服务端端口号:8080
int getLocalPort();
//7. 获取虚拟项目名称
String getContextPath();

2 HttpServletResponse

  1. HttpServletResponse对象是服务器的响应对象,这个对象封装了向客户端发送数据(响应体),发送响应头,发送响应状态码(响应行)的方法
2.1 设置响应头信息
//1. 设置响应头,按key-value键值对的方式,如果存在相同的key,会把value值覆盖
	//1. setHeader("Content-Type","text/html"),可以设置响应数据的格式,浏览器会按该格式,对响应体中数据进行渲染
	//2. text/plain表示纯文本,如果以纯文本现实网页,那么网页中的标签,全部会以字符串显式
void setHeader(String var1, String var2);
//2. 设置响应头,但不会覆盖值
void addHeader(String var1, String var2);
//3. 设置响应数据的格式,等同于setHeader("Content-Type",var1)
void setContentType(String var1);
2.2 设置响应行信息(状态码)
//1. 设置响应状态码
void sendError(int var1, String var2) throws IOException;
2.3 设置响应体信息
//1. 返回响应数据的输出流
PrintWriter getWriter() throws IOException;
2.4 向客户端浏览器响应图片
InputStream is = new FileInputStream(new File("C:\\Users\\ThinkPad\\Desktop\\截图\\1.png"));
byte[] buff = new byte[is.available()];
is.read(buff);
//1. 应该在响应之前设置响应类型,如果不设置,使用默认的,设置错了,会乱码显示
//2. setContentType中的参数可以为任意MIME类型
response.setContentType("image/jpeg");
OutputStream os = response.getOutputStream();
os.write(buff);
os.flush();
is.close();
os.close();
2.5 文件下载
//1. 当浏览器没法处理你设置的文件类型时,浏览器会弹窗询问是要下载还是使用某个应用程序打开该文件
//2. 设置为bin格式,表示即使浏览器能打开这种文件,也不让它打开,只进行下载
response.setContentType("bin");
//3. 告诉浏览器内容配置为附件,下载时显式的名字为aa.jgp
//4. 因为文件名存放在响应头中,我们无法通过其他方法修改tomcat对它的编码方式
String name = new String("吴思含".getBytes("utf-8"),"iso-8859-1");
//5. 设置Content-disposition:指定文件名、指定以下载的方式获取文件
response.addHeader("Content-disposition","attachment;filename="+name+".jsp");
2.6 5s后跳转
//一般用js实现这种功能
response.setHeader("refresh","5;https://www.baidu.com");

3 用户登录项目

  1. 使用原生的方式生成页面
  2. 浏览器发送请求后显示登录界面
  3. 用户填写相应的用户数据,发送请求给服务端
  4. 服务端接收到请求后,进行逻辑处理
  5. 服务端将处理后的结果返回客户端
3.1 代码分层:这里指应该分几个package

M:模型 V:视图 C:控制器

  1. java:control–>service–>dao,代码书写从内向外,即先编写dao层,然后编写service层,最后control
    1. control:接收参数–C
    2. service:进行逻辑处理–C
    3. dao:数据库交互–M
  2. html–V
3.2 代码
  1. HelloWorld:用于动态返回登录页面,放在control包下
package control;

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

public class HelloWorld extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("接收到客户端请求,返回响应的页面");
        resp.getWriter().write("<html>");
        resp.getWriter().write("<head>");
        resp.getWriter().write("</head>");
        resp.getWriter().write("<body>");
        //点击后,会转到login这个servlet中
        resp.getWriter().write("<form action='login' method='get'>");

        resp.getWriter().write("username:<input type='text' name='name' value=''><br/>");
        resp.getWriter().write("password:<input type=\"text\" name=\"pwd\" value=\"\"><br/>");
        resp.getWriter().write("<input type=\"submit\" value=\"login\">");

        resp.getWriter().write("</form>");
        resp.getWriter().write("</body>");
        resp.getWriter().write("</html>");


        resp.getWriter().write("</html>");

    }

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


  1. User:表中数据,对应java中的类,放在entity包下
package entity;

public class User {
    private int id;
    private String name;
    private String pwd;

    public User(String name, String pwd) {
        this.name = name;
        this.pwd = pwd;
    }

    public User(int id, String name, String pwd) {
        this.id = id;
        this.name = name;
        this.pwd = pwd;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

  1. 导入Oracle驱动包:需要先导入Modules,再导入Artifacts
  2. UserDao:与数据库交互的接口,放在dao包内
package dao;

import entity.User;

public interface UserDao {
    public User checkUser(User user);
}

  1. UserDaoImpl:与数据库进行交互的具体实现,放在dao/impl包内
package dao.impl;

import dao.UserDao;
import entity.User;

import java.sql.*;

public class UserDaoImpl implements UserDao {

    @Override
    public User checkUser(User user) throws SQLException, ClassNotFoundException {
        //1. 要使用JDBC接口,需要先将对应数据库的具体实现类加载进来,jdk6以后不需显示加载驱动
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //2. 根据url连接参数,找到与之匹配的Driver对象,调用其方法获取连接
        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.15.110:1521:fcrhost","c50hst","c50hst");
        PreparedStatement stmt = conn.prepareStatement("select * from user_table where name = ? and pwd = ?");
        stmt.setString(1,user.getName());
        stmt.setString(2,user.getPwd());
        ResultSet rs = stmt.executeQuery();
        while(rs.next()){
            User u = new User(rs.getInt("name"),rs.getString("name"),rs.getString("pwd"));
        }
        //3. 依次关闭ResultSet,Statement,Connection等资源
        rs.close();
        stmt.close();
        conn.close();
    }
}

  1. UserServiceInterface:处理业务逻辑的接口:放在service包内
package service;

import entity.User;

import java.sql.SQLException;

public interface UserServiceInterface {
    public User service(User user) throws SQLException, ClassNotFoundException;
}

  1. UserServiceImpl:处理业务逻辑的具体实现,业务逻辑中会包括与数据库交互(调用dao层),以及其他逻辑,放在service/impl包内
package service.impl;

import dao.UserDao;
import dao.impl.UserDaoImpl;
import entity.User;
import service.UserServiceInterface;

import java.sql.SQLException;

public class UserServiceImpl implements UserServiceInterface {
    UserDao ud = new UserDaoImpl();
    @Override
    public User service(User user) throws SQLException, ClassNotFoundException {
        return ud.checkUser(user);
    }
}

  1. LoginServlet:接收参数,调用service层
package control;

import entity.User;
import service.UserServiceInterface;
import service.impl.UserServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;

public class LoginServlet extends HttpServlet {
    UserServiceInterface userServiceInterface = new UserServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        String pwd = req.getParameter("pwd");
        User u = new User(name, pwd);
        User user = null;
        try {
            user = userServiceInterface.service(u);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        if (user != null) {
            resp.getWriter().write("success");
        } else {
            resp.getWriter().write("failure");
        }

    }

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

  1. web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>control.HelloWorld</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>LogIn</servlet-name>
        <servlet-class>control.LoginServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogIn</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
</web-app>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值