Servlet/JSP
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的运行原理如下:
- 客户端发送HTTP请求到Web服务器。
- Web服务器接收到请求后,将请求发送给JSP引擎。
- JSP引擎将JSP文件编译成Servlet源代码。
- JSP引擎将Servlet源代码编译成可执行的Java字节码。
- Web服务器将生成的Servlet类加载到内存中,并实例化一个Servlet对象。
- Servlet对象处理请求,生成动态内容,并将结果发送回Web服务器。
- 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();
}
}