2024年6月10日,Web体系结构与程序设计课程期末复习。
题型:
<body>
标记用于定义HTML文档所要显示的内容,也称为(主体标记)。line-height
)。font-style
)。head
)标记中,并且用(css
)标记定义。<input />
标记有多个属性,其中(type)属性为其最基本的属性,用于指定不同的控件类型。var x=11; var y="number"; var m=x+y;
,此时m的值为(11number
)。CSS(层叠样式表,Cascading Style Sheets)是一种用于描述HTML或XML等标记语言中元素如何呈现的样式语言。它通过选择器和属性来控制网页的布局、外观和交互效果。
html<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- 页面内容 -->
</body>
</html>
HTML(HyperText Markup Language)是一种标记语言,用于描述网页的结构和内容。它使用标签(例如<h1>
、<p>
、<div>
等)来定义网页中的不同元素,如标题、段落、图像、链接等。HTML提供了一种结构化的方式来组织和呈现文本、图像和其他媒体内容。
CSS(Cascading Style Sheets)是一种样式表语言,用于描述HTML或XML等标记语言中元素的外观和布局。它通过选择器和属性来控制网页的样式,包括字体、颜色、背景、边框、布局等。CSS使得开发者可以将样式与内容分离,提供一种灵活、可重用的方式来美化和布局网页。
DOM(Document Object Model)是一种将HTML或XML文档表示为树状结构的API(应用程序编程接口)。它提供了一种访问和操作网页文档的方式。通过DOM,开发者可以使用JavaScript等编程语言来动态地创建、修改、删除和交互网页中的元素和内容。DOM将网页文档表示为一个节点树,每个节点都代表着文档中的一个元素、属性或文本等。
JavaScript是一种高级的、解释型的编程语言,用于为网页添加动态交互和功能。它可以直接嵌入到HTML文档中,通过与DOM和CSS配合使用,对网页进行动态操作和修改。JavaScript可以响应用户的事件(如点击、鼠标移动等),执行特定的代码逻辑,改变网页的状态、更新内容、处理表单数据、发送请求等。JavaScript也可以与服务器进行通信,实现与后端交互和数据处理。
hello world!~~
,使用css将其字体设置为宋体红色。html<!DOCTYPE html>
<html>
<head>
<style>
/* CSS样式 */
body {
font-family: "宋体", SimSun, sans-serif; /* 设置字体为宋体 */
color: red; /* 设置字体颜色为红色 */
}
</style>
</head>
<body>
<h1>hello world!~~</h1>
</body>
</html>
html<!DOCTYPE html>
<html>
<head>
<script>
// 定义全局变量,用于存储数字
var count = 0;
// 自增函数,每次点击按钮数字加一
function increment() {
count++;
document.getElementById("number").innerText = count;
}
</script>
</head>
<body>
<h1>数字:<span id="number">0</span></h1>
<button onclick="increment()">点击加一</button>
</body>
</html>
Server Internal Error
)。$CATALINA_HOME/conf
)目录中。客户端向服务端发起请求,服务端处理请求并且返回给客户端,客户端视情况继续发送请求或关闭连接
ServletContext
)。sendRedirect
方法)。ServletRequestListener
接口)。<servlet-mapping>
元素下配置多个<url-pattern>
子元素能实现Servlet的多重映射。注解映射的话要使用urlPatterns属性,传入字符串数组。
getResource
)方法用于返回映射到某个资源文件的URL对象。String resourcePath = "/path/to/resource.txt"; URL resourceURL = context.getResource(resourcePath);```
getRealPath
)。setAttribute
)。ServletContext
)对象代表当前Web应用。SetvletConfig
)对象中。<servlert-mapping>
元素用于映射一个Servlet的对外访问路径,该路径也称为(URL pattern)。forward
)。<session-timeout>
标签指定的超时必须为一个整数,如果这个整数是为0或负整数,则session永远不会超时。<servlet-name>
元素的值的方法是(getServletName
)。映射url为“/”的servlet,它的作用在于没有servlet可以和请求url匹配时提供服务。
充当servlet之间的共享内存;获取共享配置信息和初始化参数;通过该接口访问web应用程序级别的资源。
javapublic class ShowTimesServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取ServletContext对象
ServletContext servletContext = getServletContext();
// 从ServletContext中获取访问次数
Integer times = (Integer) servletContext.getAttribute("visitTimes");
// 判断访问次数是否存在
if (times == null) {
times = 1; // 若不存在,则初始化为1
} else {
times += 1; // 若存在,则加1
}
// 将访问次数存储到ServletContext中
servletContext.setAttribute("visitTimes", times);
// 设置响应内容
response.setContentType("text/html");
response.getWriter().println("<h1>网站访问次数:" + times + "</h1>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
javapublic class ConfigInfoServlet extends HttpServlet {
private String encoding;
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 从配置文件中获取参数值
encoding = config.getInitParameter("encoding");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置响应内容
response.setContentType("text/html");
response.setCharacterEncoding(encoding);
response.getWriter().println("<h1>Encoding: " + encoding + "</h1>");
}
}
cookie.setMaxAge(0);
<session-timeout>
元素中的时间值设置成0或一个负数,则表示会话永不超时。public Cookie(String name, String value)
。会话技术由session和cookie共同支撑,它的作用在于在http无状态的基础上,使服务端能够获知发起请求的客户端的身份,从而维持服务端与该客户端的会话。
javapublic class LastAccessServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
Cookie[] cookies = request.getCookies();
Cookie lastAccessCookie = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals("lastAccess")) {
lastAccessCookie = cookie;
break;
}
}
}
if (lastAccessCookie != null) {
String lastAccessTime = lastAccessCookie.getValue();
out.println("Last Access Time: " + lastAccessTime);
} else {
Cookie newCookie = new Cookie("lastAccess", new Date().toString());
newCookie.setMaxAge(3600); // 设置存活时间为1小时
response.addCookie(newCookie);
out.println("Cookie has been set for the first time.");
}
}
}
javapublic class DownManagerServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String referer = request.getHeader("referer");
// 判断referer是否存在且符合条件
if (referer != null && referer.startsWith("http://www.example.com")) {
// 可以进行资源下载
// 下载逻辑代码...
response.getWriter().println("Downloading resource...");
} else {
// 防盗链,禁止资源下载
response.getWriter().println("Access denied. Resource cannot be downloaded.");
}
}
}
<dispatcher>
的默认取值是(REQUEST)。<filter-mapping>
)。
xml<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/servlet1</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Filter2</filter-name>
<url-pattern>/servlet1</url-pattern>
</filter-mapping>
<dispatcher>
元素可以指定 Filter 拦截的资源被容器调用的方式。<listener>
)。 <url-pattern>
)。过滤器的生命周期和Web应用生命周期一致。包括init -> doFilter -> destroy三个阶段。
javapublic class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作(可选)
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 在请求处理之前执行的逻辑
PrintWriter out = response.getWriter();
out.println("Hello MyFilter");
// 将请求传递给下一个过滤器或目标资源
chain.doFilter(request, response);
// 在请求处理之后执行的逻辑(可选)
}
@Override
public void destroy() {
// 清理操作(可选)
}
}
xml<filter>
<filter-name>MyFilter</filter-name>
<filter-class>MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
Java Database Connectivity,是Java程序访问数据库的规范。它提供了一种统一的方式来访问不同数据库系统,使得开发者可以使用相同的编程接口与不同的数据库进行交互。通过JDBC规范,开发者可以编写与数据库无关的代码,从而实现数据库的连接、查询、更新等操作,并能够在不同数据库之间进行切换,而无需修改大部分的应用程序代码。
javaimport java.sql.*;
public class ReadUsersTable {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/db_name";
String username = "username";
String password = "password";
try {
// 建立数据库连接
Connection connection = DriverManager.getConnection(url, username, password);
// 创建查询语句
String query = "SELECT id, name, password, email FROM users";
Statement statement = connection.createStatement();
// 执行查询语句并获取结果集
ResultSet resultSet = statement.executeQuery(query);
// 遍历结果集并获取字段值
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String password = resultSet.getString("password");
String email = resultSet.getString("email");
// 处理获取到的字段值
System.out.println("ID: " + id);
System.out.println("Name: " + name);
System.out.println("Password: " + password);
System.out.println("Email: " + email);
System.out.println("-------------------");
}
// 关闭连接和资源
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
String sql = "INSERT INTO users(name,password) VALUES(?,?)";
javaimport java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCUtils {
private static final String url = "jdbc:mysql://localhost:3306/db_name"; // 替换成实际的数据库连接URL
private static final String username = "username"; // 替换成实际的数据库用户名
private static final String password = "password"; // 替换成实际的数据库密码
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, username, password);
}
public static void closeConnection(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
javaimport java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class Example02 {
public static void main(String[] args) {
String sql = "INSERT INTO users(name, password) VALUES (?, ?)";
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
connection = JDBCUtils.getConnection();
preparedStatement = connection.prepareStatement(sql);
// 设置参数并添加批处理
for (int i = 1; i <= 5; i++) {
preparedStatement.setString(1, "User " + i);
preparedStatement.setString(2, "password" + i);
preparedStatement.addBatch();
}
// 执行批处理
int[] result = preparedStatement.executeBatch();
// 输出批处理执行结果
for (int i : result) {
System.out.println("Rows affected: " + i);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 释放资源
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
JDBCUtils.closeConnection(connection);
}
}
}
<named-config>
)结点代表自定义配置,一个配置文件中可以有零个或多个的自定义配置。String sql = "select * from user where id = ?";
下面操作中,能实现查询指定记录的语句是(User user = (User)runner.query(sql, new BeanHandler(User.class), new Object[]{id});
)。后面那个id是那个sql语句里面的占位符。
Class.forName
)。<named-config>
结点可出现多次。避免开发者忘记释放资源;加速对数据库的访问,,提高并发能力的同时,避免数据库因维持连接过多而崩溃。
数据库连接池会维持一定数量的数据库连接,当应用程序需要连接来访问数据库时,就可以从连接池中获取连接。数据库连接池会对这些连接进行管理,确保每次给应用返回的都是可用的连接。当应用使用连接结束后,数据库连接池会重新将其分配给其他请求方。除此之外,数据库连接池还会对连接进行验证,超时处理,动态调整连接数,并且在最后关闭应用时自动销毁所有连接。
DriverManager每次需要手动进行配置,DataSource获取连接时,连接的配置和管理通常由连接池实现类来处理。并且DataSource相较于DriverManager,扩展性更好。
INSERT INTO user (id,name,password) VALUES (1,'zhangsan','123456')
;query(String sql, ResultSetHandler<?> rsh, Object... params)
方法。javapublic class ResultSetTest {
public static void main(String[] args) {
// 插入记录的SQL语句
String insertSql = "INSERT INTO user (id, name, password) VALUES (1, 'zhangsan', '123456')";
// 查询记录的SQL语句
String querySql = "SELECT * FROM user LIMIT 1";
// 执行插入记录操作
BaseDao.execute(insertSql);
// 使用BeanListHandler来将结果封装为List<User>对象
ResultSetHandler<List<User>> handler = new BeanListHandler<>(User.class);
// 执行查询操作并获取结果
List<User> userList = BaseDao.query(querySql, handler);
// 输出结果
for (User user : userList) {
System.out.println(user);
}
}
}
mysql> SELECT * FROM user; | id | name | password | | 1 | zhangsan | 123456 | | 2 | lisi | 123456 | | 3 | wangwu | 123456 |
query(String sql, ResultSetHandler<?> rsh, Object... params)
方法。javaimport org.apache.commons.dbutils.ResultSetHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.util.List;
public class ResultSetTest2 {
public static void main(String[] args) {
// 查询记录的SQL语句
String querySql = "SELECT * FROM user";
// 使用BeanListHandler来将结果封装为List<User>对象
ResultSetHandler<List<User>> handler = new BeanListHandler<>(User.class);
// 执行查询操作并获取结果
List<User> userList = BaseDao.query(querySql, handler);
// 输出结果
for (User user : userList) {
System.out.println(user);
}
}
}
List<FileItem>
)。List<FileItem>
类型集合的方法是(parseRequest)。javaimport java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FileDownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取要下载的文件路径和文件名(假设为filePath和fileName)
String filePath = "/path/to/file"; // 文件路径
String fileName = "example.txt"; // 文件名
// 设置响应头
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + getEncodedFileName(request, fileName));
// 读取文件并写入响应输出流
try (InputStream inputStream = new FileInputStream(new File(filePath));
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
}
// 获取编码后的文件名
private String getEncodedFileName(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
String userAgent = request.getHeader("User-Agent");
boolean isIE = userAgent != null && userAgent.contains("MSIE");
if (isIE) {
// IE浏览器使用URL编码
return java.net.URLEncoder.encode(fileName, "UTF-8");
} else {
// 其他浏览器使用Base64编码
return new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
}
}
}
javaimport java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
public class UploadServlet extends HttpServlet {
private static final String UPLOAD_DIRECTORY = "/upload"; // 上传文件保存的目录
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if (ServletFileUpload.isMultipartContent(request)) {
// 创建文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置临时文件存储目录
File tempDirectory = (File) getServletContext().getAttribute("javax.servlet.context.tempdir");
factory.setRepository(tempDirectory);
// 创建文件上传处理器
ServletFileUpload fileUpload = new ServletFileUpload(factory);
try {
// 解析请求,获取文件项列表
java.util.List<FileItem> fileItems = fileUpload.parseRequest(request);
for (FileItem item : fileItems) {
if (!item.isFormField() && "myfile".equals(item.getFieldName())) {
String fileName = new File(item.getName()).getName();
String filePath = getServletContext().getRealPath(UPLOAD_DIRECTORY) + File.separator + fileName;
// 保存文件到指定目录
try (InputStream inputStream = item.getInputStream()) {
Files.copy(inputStream, new File(filePath).toPath(), StandardCopyOption.REPLACE_EXISTING);
}
// 文件上传成功
response.getWriter().println("文件上传成功!");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
response.getWriter().println("文件上传失败!");
}
} else {
response.getWriter().println("无法处理该请求!");
}
}
}
html<form action="uploadServlet" method="post" enctype="multipart/form-data">
<!-- 文件上传表单项 -->
<input type="file" name="myfile">
<!-- 其他表单项 -->
<input type="text" name="name">
<!-- 提交按钮 -->
<input type="submit" value="上传">
</form>
xml<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.example.UploadServlet</servlet-class>
<multipart-config>
<!-- 设置文件上传的最大大小,单位为字节 -->
<max-file-size>1048576</max-file-size>
<!-- 设置整个请求的最大大小,包括文件和其他表单项,单位为字节 -->
<max-request-size>1048576</max-request-size>
<!-- 设置临时文件存储路径 -->
<location>/path/to/temp/directory</location>
</multipart-config>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/uploadServlet</url-pattern>
</servlet-mapping>
本文作者:御坂19327号
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!