JavaWeb三大组件之Servlet

1. Servlet

一、Servlet介绍

1、概念

Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。

2、实现过程

1.客户端发送请求至服务器端;

2.服务器将请求信息发送至 Servlet;

3.Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

4.服务器将响应返回给客户端。

3、生命周期

1.客户端请求该 Servlet;

2.加载 Servlet 类到内存;

3.实例化并调用init()方法初始化该 Servlet;

4.service()(根据请求方法不同调用doGet() 或者 doPost(),此外还有doHead()、doPut()、doTrace()、doDelete()、doOptions()、destroy())。

二、Request对象(获取请求信息)

2.1获取相应消息数据

2.2 获取请求参数

java 复制代码
String getParameter(String name):根据参数名称获取参数值  
String[] getParameterValues(String name):根据参数名称获取参数值的数组
Enumeration<String> getParameterNames():获取所有请求的参数名称
 Map<String,String[]> getParameterMap():获取所有参数的map集合

2.3请求转发

  1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)

  2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)

2.4 共享数据

复制代码
void setAttribute(String name,Object obj):存储数据

Object getAttitude(String name):通过键获取值

void removeAttribute(String name):通过键移除键值对

post乱码解决

在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");

三、Response对象(设置响应消息)

3.1 设置响应消息

3.2 重定向

方法:response.sendRedirect("路径");

特点:1. 地址栏发生变化

  1. 重定向可以访问其他站点(服务器)的资源

  2. 重定向是两次请求。不能使用request对象来共享数据

重定向与转发的区别

forward:一般用于用户登陆的时候,根据角色转发到相应的模块。

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等。

四、综合案例

4.1新建项目步骤

4.2 pom.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.beiyou</groupId>
    <artifactId>servlet</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>servlet</name>
    <packaging>war</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <junit.version>5.8.1</junit.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.2</version>
            </plugin>
        </plugins>
    </build>
</project>

4.3 web.xml

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>HelloServlet</servlet-name>
        <servlet-class>com.beiyou.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello-servlet</url-pattern>
    </servlet-mapping>
</web-app>

4.4 HelloServlet.java

java 复制代码
package com.beiyou.servlet;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

//@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
    private String message;

    public void init() {
        message = "Hello World!";
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //response.setContentType("text/html");
        response.setHeader("Content-Type","text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1> Servlet 你好,这是您要的麻婆豆腐 </h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

4.5 乱码-解决

中文乱码

解决ide控制台乱码

五、使用注解

java 复制代码
@WebServlet(name = "helloServlet", value = "/hello-servlet")

1.1 使用JSP页面

1、编写a.jsp页面

javascript 复制代码
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>

<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1>
    <%= "潘周聃1写死" %>
</h1>
<hr/>
<h1>
    <%
        Object value = request.getAttribute("name");
        out.println(value);
    %>
</h1>
<hr/>
<h1>
    ${requestScope.name}
</h1>
<hr/>
<h1>
    id: ${requestScope.user.id}
</h1>
<h1>
    姓名: ${requestScope.user.name}
</h1>


</body>
</html>

request和requestScope的区别_xiangwang2016的博客-CSDN博客_requestscope

EL表达式中,param和requestScope的区别在看param和requestScope之前,不妨先了解下在java下request的情况:1. request对象通常用来接收客户端提交到服务端的数据,如:在servlet或者action中可以用request.getParameter()的方法获取获取参数内容;2. requestScope通常是在servlet或者ac...

https://blog.csdn.net/xiangwang2016/article/details/85119692

2、Servlet传递参数到jsp页面

java 复制代码
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
      
        //通过请求作用域对象HttpServletRequest接口添加共享数据
        request.setAttribute("name","苍老师");//将数据写入请求作用于对象name(key名称)
        Map<String,Object> map  = new HashMap<>();
        map.put("id",1);
        map.put("name","潘周聃");
        request.setAttribute("user",map);        //通过请求转发索要a.jsp并写入到响应体中
        request.getRequestDispatcher("a.jsp").forward(request,response);           
    }
html 复制代码
<body>

<%
  Object o= request.getAttribute("name") ;
  out.println(o);
%>

 基本类型:${requestScope.name}
 对象id:${requestScope.user.id}
 对象name:${requestScope.user.name}
</body>

1.2 使用模板引擎

1.引入模板库

XML 复制代码
 <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.taglibs</groupId>
            <artifactId>taglibs-standard-impl</artifactId>
            <version>1.2.5</version>
   </dependency>

2. servlet 传递集合

java 复制代码
public class User {
    private int id;
    private String  name;
}
java 复制代码
   request.setAttribute("userLst",userLst);

request.getRequestDispatcher("template.jsp").forward(request,response);

3. 页面头加上渲染方式

XML 复制代码
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
html 复制代码
<h1>使用模板引擎</h1>

<table>
    <c:forEach items="${requestScope.userLst}" var="user">
        <tr>
            <td>${user.id }</td>
            <td>${user.name }</td>
        </tr>
    </c:forEach>
</table>

1.3 使用Post接受表单请求

1.书写表单

html 复制代码
<form method="post" action="a">
    <input type="text" name="id" placeholder="请输入名 ">
    <input type="text" name="name" placeholder="请输入姓 ">
    <input type="submit" value="提交" >
</form>

2.书写doPost

java 复制代码
  @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理表单数据
        req.setCharacterEncoding("UTF-8");
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        //构造一个响应页
        resp.setHeader("Content-Type","text/html;charset=utf-8");
        //一旦调用getWriter方法,此时header的内容就不能更改
        Writer writer = resp.getWriter();
        writer.write("<html>");
        writer.write("id: "+id);
        writer.write("<br/>");
        writer.write("name: "+name);
        writer.write("</html>");

    }

3.Post传输Json数据

3.1 引入fastjson包

XML 复制代码
   <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.28</version>
      </dependency>

3.2 form表单提交

复制代码
url:http://localhost:8080/demo/bBody:{"id":5,"name":"zhouxingxing"}

3.3 书写doPost方法

java 复制代码
 @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //读取request body 数据
        ServletInputStream inputStream = request.getInputStream();

        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

        String  jsonStr = "";

        String  line;

        while ((line = bufferedReader.readLine()) != null){

            jsonStr += line;

        }

        // 转成对象

        JSONObject jsonObject = JSONObject.parseObject(jsonStr);


        JSONObject jsonObject2 = new JSONObject();
        //正常成功时候返回的格式
        jsonObject2.put("code",0);
        jsonObject2.put("data",jsonObject);
        jsonObject2.put("message","请求成功");
        //失败的时候返回的格式

       // jsonObject2.put("code",1);
       // jsonObject2.put("data",null);
       // jsonObject2.put("message","连接数据库失败");


        response.setCharacterEncoding("utf-8");

        response.setContentType("application/json");

        response.getWriter().write(String.valueOf(jsonObject2));


//        PrintWriter writer = response.getWriter();
//        writer.println("<html>");
//        writer.println("<body>");
//        writer.println("id -> "+jsonObject.getString("id"));
//        writer.println("<br/>");
//        writer.println("name -> "+jsonObject.getString("name"));
//        writer.println("</body>");
//        writer.println("</html>");

    }

成功:

失败:

相关推荐
linmengmeng_13146 小时前
【Jenkins】Jenkins配置从节点 - Launch Agent
运维·servlet·jenkins
musenh1 天前
servlet入门
servlet
wfsm2 天前
flowable使用01
java·前端·servlet
六件套是我3 天前
redission实现延时队列
android·java·servlet
非典型代码4 天前
Jenkins发不出邮件
运维·servlet·jenkins
佐杰5 天前
Jenkins安装部署
运维·servlet·jenkins
chxii5 天前
Spring Boot 中,内嵌的 Servlet 容器(也称为嵌入式 Web 服务器)
spring boot·servlet
BUG?不,是彩蛋!6 天前
Maven-Java 项目到底解决了什么痛点?
java·servlet·maven
CS Beginner9 天前
【搭建】个人博客网站的搭建
java·前端·学习·servlet·log4j·mybatis
一只小透明啊啊啊啊12 天前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet