Servlet/JSP

发布时间 2023-10-14 14:24:57作者: BattleofZhongDinghe

Servlet/JSP

IDEA配置



然后可以看到默认给你一个Hello World
然后注意端口占用的问题


Hello World项目源码


index.jsp(src/main/webapp/WEB-INF/index.jsp)

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %>
</h1>
<br/>
<a href="hello-servlet">Hello Servlet</a>
</body>
</html>

HelloServlet.java(src/main/java/com.example.servlet/HelloServelt)

package com.example.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");

        // Hello
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>" + message + "</h1>");
        out.println("</body></html>");
    }

    public void destroy() {
    }
}

pom.xml(target/pom.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.example</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>

如何导出为war/jar









Servlet生命周期,作用,继承结构详解

Servlet生命周期是指Servlet从创建到销毁的整个过程。一个Servlet在被容器加载、初始化、接收请求、处理请求、发送响应和销毁等过程中经历了不同的阶段。
Servlet的生命周期包括以下几个阶段:
加载:当Servlet容器启动时,会加载Servlet类。这通常发生在第一次请求到达之前。容器会根据web.xml配置文件或注解来确定要加载的Servlet类。
初始化:在加载Servlet类后,容器会创建Servlet的实例,并调用其init()方法进行初始化。在init()方法中,可以进行一些初始化操作,如获取配置信息、建立数据库连接等。
服务:一旦Servlet初始化完成,容器就可以接收客户端的请求,并调用Servlet的service()方法来处理请求。在service()方法中,可以根据请求的类型(GET、POST等)执行相应的业务逻辑。
销毁:当Servlet容器关闭或者应用程序重新加载时,容器会调用Servlet的destroy()方法来销毁Servlet。在destroy()方法中,可以释放资源、关闭数据库连接等。
Servlet的作用是处理客户端的请求并生成相应的响应。它可以用于开发Web应用程序,实现与客户端的交互。Servlet可以处理各种类型的请求,如HTTP请求、SOAP请求等,并根据请求的内容生成相应的响应。
Servlet继承结构详解:
Servlet接口是javax.servlet包中定义的一个接口,所有的Servlet类都必须实现这个接口。Servlet接口定义了一些方法,如init()、service()、destroy()等,用于处理请求和管理Servlet的生命周期。
除了Servlet接口,还有两个抽象类可供继承:GenericServlet和HttpServlet。
GenericServlet:这是一个通用的Servlet抽象类,实现了Servlet接口。它提供了一些常用的方法,如init()、service()、destroy()等,并且没有对请求类型做出特定的假设。因此,可以用于处理各种类型的请求。
HttpServlet:这是一个专门用于处理HTTP请求的Servlet抽象类,继承自GenericServlet。它提供了一些特定于HTTP请求的方法,如doGet()、doPost()等,用于处理不同类型的HTTP请求。
开发者可以根据需要选择继承GenericServlet或HttpServlet,并根据具体的业务逻辑实现相应的方法。此外,开发者还可以通过实现Servlet接口来自定义Servlet类,以满足特定的需求。

发送GET和POST请求

发送GET请求

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ServletGet {
    public static void main(String[] args) {
        try {
            // 构建GET请求的URL
            String urlStr = "http://xxx/?payload=123456";

            // 发送GET请求
            URL url = new URL(urlStr);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");

            // 获取响应结果
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String responseBody = br.readLine();
            System.out.println(responseBody);

            // 关闭连接和流
            br.close();
            conn.disconnect();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

发送POST请求

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ServletPost {
    public static void main(String[] args) {
        try {
            //发送的内容
            String Payload = "payload=123456";

            // 发送POST请求到xxx
            URL url = new URL("http://xxx/");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setDoOutput(true);

            // 将Payload作为请求体发送
            OutputStream os = conn.getOutputStream();
            os.write(Payload.getBytes());
            os.flush();

            // 获取响应结果
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String responseBody = br.readLine();
            System.out.println(responseBody);

            // 关闭连接和流
            os.close();
            br.close();
            conn.disconnect();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

JSP的简介和原理

JSP(JavaServer Pages)是一种动态网页技术,用于在Web服务器上生成动态内容。它是Java Servlet技术的扩展,允许在HTML页面中嵌入Java代码。
JSP的运行原理如下:

  1. 客户端发送HTTP请求到Web服务器。
  2. Web服务器接收到请求后,将请求发送给JSP引擎。
  3. JSP引擎将JSP文件编译成Servlet源代码。
  4. JSP引擎将Servlet源代码编译成可执行的Java字节码。
  5. Web服务器将生成的Servlet类加载到内存中,并实例化一个Servlet对象。
  6. Servlet对象处理请求,生成动态内容,并将结果发送回Web服务器。
  7. Web服务器将动态内容作为HTTP响应发送给客户端。
    在JSP中,可以使用HTML标签和JSP标签混合编写页面。JSP标签以"<%"和"%>"包围,用于插入Java代码。JSP引擎会将JSP页面转换成一个Servlet类,其中的Java代码会被编译成Servlet的方法。这样,JSP页面就可以动态生成内容,并与数据库、JavaBean等进行交互。
    JSP的优点包括易学易用、代码重用、可维护性高等。它适用于开发动态网页、Web应用程序和企业级应用程序。

Servlet/JSP的三种原始标签和四大作用域

Servlet/JSP的三种原始标签是:<% %>、<%= %> 和 <%! %>。
<% %>:这是最常用的标签,用于插入Java代码段。可以在其中编写任何有效的Java代码,如变量声明、方法调用等。
<%= %>:这个标签用于输出表达式的值到页面上。可以在其中使用任何有效的Java表达式,它会被计算并将结果输出到页面。
<%! %>:这个标签用于定义类级别的成员,如变量、方法和构造函数。这些成员可以在整个JSP页面中共享和访问。
四大作用域是指在Servlet/JSP中用于存储和共享数据的四个作用域对象,分别是:
pageContext:页面级别的作用域,存储在当前JSP页面中的数据,在整个页面中可见。
request:请求级别的作用域,存储在HttpServletRequest对象中的数据,在同一个请求中的不同页面和Servlet之间可见。
session:会话级别的作用域,存储在HttpSession对象中的数据,在同一个用户会话中的不同请求之间可见。
application:应用级别的作用域,存储在ServletContext对象中的数据,在整个Web应用程序中可见。
这些作用域对象可以通过在Servlet/JSP中使用相应的API来访问和操作,以实现数据的共享和传递。

EL表达式

EL表达式(Expression Language)是一种用于在JSP和JSF页面中访问和操作数据的简洁、灵活的表达式语言。它提供了一种简化和统一的语法,用于在页面中获取、设置和操作变量、属性和集合等数据。
EL表达式的语法类似于JavaScript的语法,使用{}来包围表达式。在{}中可以使用一系列的运算符和函数来操作数据,例如访问对象的属性、调用方法、进行算术运算、比较和逻辑运算等。
EL表达式的主要特点包括:
简洁易用:EL表达式提供了一种简洁的语法,可以方便地在页面中获取和操作数据。
统一性:EL表达式可以用于不同的容器和框架,如JSP、JSF等,提供了一种统一的访问数据的方式。
安全性:EL表达式提供了一些安全机制,可以限制访问某些敏感数据,防止恶意代码的执行。
扩展性:EL表达式支持自定义函数和变量解析器,可以扩展其功能和灵活性。
EL表达式广泛应用于JSP和JSF页面中,用于获取和显示数据、控制页面的显示和行为。它可以与JSTL(JSP Standard Tag Library)和其他框架一起使用,提供更强大和灵活的页面开发能力。
以下是一使用EL表达式的示例:
访问变量:
${name}:获取名为name的变量的值。
访问对象的属性:
${user.name}:获取user对象的name属性的值。
调用对象的方法:
${user.getName()}:调用user对象的getName方法,并获取返回值。
数组和集合的访问:
${array[0]}:获取数组array的第一个元素的值。
${list.size()}:调用list集合的size方法,获取集合的大小。
算术运算:
${num1 + num2}:计算num1和num2的和。
比较运算:
${age > 18}:判断age是否大于18,返回布尔值。
逻辑运算:
${flag && true}判断flag是否为true,返回布尔值。
使用EL表达式遍历集合:
<c:forEach items="${users}" var="user">
${user.name}
</c:forEach>
在java代码中使用

boolean flag = (boolean) expressionLanguage.evaluate("${age > 18}");

MVC模式

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑分离为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种分离使得应用程序的开发更加模块化和可维护。
模型(Model):模型是应用程序的核心组件,负责处理数据的逻辑和状态。它包含了应用程序的业务逻辑和数据操作,通常与数据库或其他数据源进行交互。
视图(View):视图是用户界面的展示层,负责将模型的数据可视化并呈现给用户。它通常是用户与应用程序交互的界面,可以是图形界面、网页或其他形式。
控制器(Controller):控制器是模型和视图之间的中介,负责协调它们之间的交互。它接收用户的输入并根据用户的操作更新模型的状态,然后将更新的数据传递给视图进行展示。
MVC模式的优点包括:
分离关注点:MVC模式将应用程序的不同组件分离,使得它们可以独立开发、测试和维护。
可扩展性:由于模型、视图和控制器之间的松耦合,可以很容易地添加新的功能或修改现有功能。
可重用性:MVC模式鼓励代码的重用,因为模型和视图可以在不同的应用程序中共享。
在Java中,可以使用各种框架和库来实现MVC模式,例如Spring MVC、JavaFX和Swing等。这些框架提供了一些工具和类来简化MVC模式的实现,并提供了一种结构化的方式来组织和管理应用程序的代码。
事例代码:

// 模型(Model)
public class UserModel {
    private String username;
    private String password;

    public UserModel(String username, String password) {
        this.username = username;
        this.password = password;
    }

    // getter和setter方法
}

// 视图(View)
public class UserView {
    public void displayUserDetails(String username, String password) {
        System.out.println("Username: " + username);
        System.out.println("Password: " + password);
    }
}

// 控制器(Controller)
public class UserController {
    private UserModel model;
    private UserView view;

    public UserController(UserModel model, UserView view) {
        this.model = model;
        this.view = view;
    }

    public void updateUserDetails(String username, String password) {
        model.setUsername(username);
        model.setPassword(password);
    }

    public void displayUserDetails() {
        String username = model.getUsername();
        String password = model.getPassword();
        view.displayUserDetails, password);
    }
}

// 主程序
public class Main {
    public static void main(String[] args) {
        // 创建模型、视图和控制器
        UserModel model = new UserModel("John", "password123");
        UserView view = new UserView();
        UserController controller = new UserController(model, view);

        // 更新模型数据并显示
        controller.updateUserDetails("Jane", "newpassword");
        controller.displayUserDetails();
    }
}