Servlet 中request与response的基本用法

Servlet 基本了解

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
	<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
	<dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.1</version>
    </dependency>

Servlet简介


  • servlet是sun公司开发的一款用来实现动态web的技术
  • 这个动态web技术提供了一个接口:Servelt
  • 想要使用,只需要编写一个类去实现这个接口即可

Servelt的使用


Maven父子工程

  • 父亲导入的jar包子项目也可以使用
  • 子项目无法使用父项目

Maven环境优化

1、pom.xml中添加依赖

<dependencies>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
			<!--作用域 <scope>provided</scope>-->
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>
    </dependencies>

2、修改 web.xml 为最新版

<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_3_1.xsd"
         version="3.1"
         metadata-complete="true">
</web-app>

3、maven结构搭建完整

  • main
    • java
    • resources
    • webapp

directory(目录)

resources(资源)

第一个Servlet程序(Hello Servlet )

步骤 1、

  • 创建一个空的maven工程

  • 创建javaclass文件

  • 继承HttpServlet类

  • 重写doGet和doPost方法

public class HelloServlet extends HttpServlet {

    //由于get和post方法只是请求实现的方式不同,所以可以相互调用,业务逻辑是一样的
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//响应流
        writer.println("Hello Servlet");

    }

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

步骤 2、

​ 编写web.xml文件中注册Servelt 和 Servlet请求路径

<servlet>
    <!--servlet名称-->
    <servlet-name>hello</servlet-name>
    <!--servlet地址-->
    <servlet-class>com.ben.servlet.HelloServlet</servlet-class>
</servlet>

<servlet-mapping>
    <!--请求的servlet名称-->
    <servlet-name>hello</servlet-name>
    <!--访问路径-->
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

ErrorServlet

修改404报错界面

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");//使用html格式显示
        resp.setCharacterEncoding("UTF-8");//使用UTF-8编码

        PrintWriter writer = resp.getWriter();
        writer.println("<h1>错误</h1>");
}

Servlet 的使用

ServletContext

1、能够实现数据的共享

在不同的servlet中想要实现数据的交互就需要使用context,context是作用与项目所有servlet之上的

存储数据 setAttribute(“数据名称”,数据内容)

读取数据 getAttribue(“数据名称”,数据内容)

例、

在一个servlet中保存数据到context中,再在另一个servlet中获取数据后使用并显示

SetServlet

public class SetContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        //this.getServletContext() 获取当前的上下文       
        ServletContext context = this.getServletContext();
        String name = "张三";
        //将数据存储到context中
        context.setAttribute("username",name);
    }
}

GetServlet

public class GetContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //从context中获取数据
        String username = (String) context.getAttribute("username");
		
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter writer = resp.getWriter();
        writer.println("名字:"+ username);
    }
}

2、能够获取初始化参数

获取xml文件的初始化参数

方法名:getInitParameter()

编写xml文件中需要获取的初始化参数

<!--初始化参数-->
<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>

Servlet 中使用context获取

使用的是context中的getInitParameter方法

public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //init (初始化) parameter(参数)
        String url = context.getInitParameter("url");
        System.out.println("url" + url);
        resp.getWriter().println(url);
    }
}

3、能够请求转发

地址不会改变的去获取其他页面数据

方法名: getResponseDispatcher()

方法名:getResponseDispatcher(“访问地址”).forward(req,resp)

public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取当前上下文
        ServletContext context = this.getServletContext();
//        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/sul");
//        requestDispatcher.forward(req,resp);
        context.getRequestDispatcher("/url").forward(req,resp);
    }
}

4、能够获取资源文件中的资源

方法名: getResourceAsStream(“资源路径”)

public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

        //使用Properties读取资源文件数据
        Properties prop = new Properties();
        prop.load(is);
        String name = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().println("name:"+name);
        resp.getWriter().println("password:"+pwd);
    }
}

HttpServletResponse

1、简单分类

负责向浏览器发送数据分方法

//平常流
ServletOutputStream getOutputStream() throws IOException;
//中文
PrintWriter getWriter() throws IOException;

负责向浏览器发送一些响应头的方法

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);

void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);

2、下载文件

获取下载文件的路径和需要下载的文件名称

让浏览器支持下载

设置下载文件的输入流

创建缓冲区

将输入流写到缓冲区中再下载到客户端

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1 获取下载文件地址
        String realPath = "C:\\Users\\86132\\IdeaProjects\\javeweb-servlet\\response\\src\\main\\resources\\1.png";
        System.out.println("下载文件的路径为:"+realPath);
        //2 获取下载文件的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\" + 1));
        //3 设置浏览器支持下载该文件
        resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
        //4 获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        //5 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        //6 获取 OutputStream 对象
        ServletOutputStream out = resp.getOutputStream();
        //7 将输入流写入到缓冲区,再用OutputStream输出到客户端
        while ((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }

        in.close();
        out.close();
    }

3、重定向

重定向是能够改变路径的访问页面

resp.sendRedirect(“访问路径”)

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理请求
        //从请求中获取参数
        ServletContext context = this.getServletContext();
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println("username=" + username);
        System.out.println("password=" + password);
        //重定向
        resp.sendRedirect("/r/success.jsp");
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<body>
<h2>Hello World!</h2>


<%--设置提交的路径,需要寻找项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目--%>
<form action="${pageContext.request.contextPath}/login" method="get">
    用户名:<input type="text" name="username"> <br>
    密码:<input type="password" name="password"> <br>
    <input type="submit">
</form>
</body>
</html>

HttpServletRequest

  • HttpServletRequest 代表了客户端(用户)的请求
  • 用户使用Http访问服务器,Http中的所有信息都会被封装在HttpServletRequest中
  • 服务器就可以使用本类中的方法接收获取用户的信息(请求)

1、获取前端传递的参数

需要jsp文件与servlet建立联系

获取单个参数 req.getParameter(“参数名”)

获取多个参数 req.getParamaterValues(“表单名”)


登录界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录界面</title>
</head>
<body>

<h1>登录</h1>
<div STYLE="text-align: center">
   
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        爱好:<br>
        <input type="checkbox" name="hobby" value="java">java
        <input type="checkbox" name="hobby" value="c++">c++
        <input type="checkbox" name="hobby" value="python">python
        <br>
        <input type="submit">
    </form>
</div>

</body>
</html>

servlet文件

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用req.getParameter("参数名")获取前端的参数
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbies));

        req.getRequestDispatcher("/success.jsp").forward(req,resp);
        resp.setCharacterEncoding("UTF-8");
    }

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

2、请求转发

请求转发 req.getRequestDispatcher()

重定向 resp.sendRedirect()


Cookie 和 Session

1、理解

客户端在访问网页某个网站的过程代表了一次会话(Session)

那么如何使服务服务器知道该用户访问过(常见应用:网站会保存用户的登录信息下次自动登录)

  • 使用Cookie标记该用户,服务器识别访问过的用户只需要识别标记即可
  • 服务器保存访问用户的信息从而下次相同用户访问时候识别

2、应用

cookie

  1. 从客户端请求中得到cookie信息

    Cookie[] cookies = req.getCookies();

  2. 服务器响应给客户端新的cookie

    resp.addCookie();

Session

Session中的数据是存与服务器中的,标识一个Session的方法是id,每一个Session都有一个唯一的id,id会在用户访问时候给用户的客户端进行储存

等到客户再次访问服务器的时候Session会通过查询客户端主机的SessionId来匹配服务器中该用户的数据

public class SessionDemo01 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

        //获取Session对象
        HttpSession session = req.getSession();
        Person person = new Person("小张");
        //在session中存入数据
        session.setAttribute("name",person);
        resp.getWriter().write(session.getId());
    }
public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        
        //获取Session中数据
        HttpSession session = req.getSession();
        Person person = (Person) session.getAttribute("name");
        resp.getWriter().write(person.toString());

    }
<!--设置session有效时间为15分钟-->
    <session-config>
        <session-timeout>15</session-timeout>
    </session-config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值