Servlet


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中
  • 服务器就可以使用本类中的方法接收获取用户的信息(请求)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐