Java Web开发基础与Servlet核心技术

Java Web开发基础与Servlet核心技术

Java Web开发基础与Servlet核心技术

在这里插入图片描述
15.1 学习目标与重点提示

学习目标:掌握Java Web开发的核心概念与Servlet技术的使用方法,包括Web应用的结构、Servlet的定义与使用、HTTP请求与响应的处理、会话管理、过滤器与监听器的使用,学会在实际开发中处理Web应用问题。
重点:Web应用的结构(目录结构、配置文件)Servlet的定义与使用(Servlet接口、HttpServlet类、注解配置)HTTP请求与响应的处理(Request、Response对象)会话管理(Session、Cookie)过滤器与监听器的使用Web开发的实际应用场景

15.2 Web开发概述

Java Web开发是用于处理Web应用的机制。

15.2.1 Web开发的定义

定义:Web开发是用于处理Web应用的机制。
作用

  • 实现Web应用的开发。
  • 实现客户端与服务器之间的通信。
  • 实现动态网页的生成。
  • 实现Web应用的部署与维护。

✅ 结论:Web开发是用于处理Web应用的机制,作用是实现Web应用的开发、客户端与服务器之间的通信、动态网页的生成、Web应用的部署与维护。

15.2.2 Web应用的结构

定义:Web应用的结构是指Java Web应用的目录结构。
常用目录

  • webapp:Web应用的根目录。
  • WEB-INF:存放Web应用的配置文件和类文件。
  • lib:存放Web应用的依赖库。
  • classes:存放Web应用的类文件。
  • web.xml:Web应用的配置文件。

✅ 结论:Web应用的结构是指Java Web应用的目录结构,常用目录包括webapp、WEB-INF、lib、classes、web.xml。

15.3 Servlet核心技术

Servlet是Java Web开发的核心技术。

15.3.1 Servlet的定义与分类

定义:Servlet是用于处理HTTP请求与响应的Java程序。
分类

  • 继承HttpServlet类的Servlet。
  • 实现Servlet接口的Servlet。

常用方法

  • doGet():处理GET请求。
  • doPost():处理POST请求。
  • doPut():处理PUT请求。
  • doDelete():处理DELETE请求。
  • init():初始化Servlet。
  • destroy():销毁Servlet。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;// 注解配置Servlet@WebServlet("/hello")publicclassHelloWorldServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 设置响应类型 response.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = response.getWriter();// 输出响应内容 out.println("<html>"); out.println("<head>"); out.println("<title>Hello World</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello, World!</h1>"); out.println("</body>"); out.println("</html>");}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doGet(request, response);}}

输出结果

<html> <head> <title>Hello World</title> </head> <body> <h1>Hello, World!</h1> </body> </html> 

✅ 结论:Servlet是用于处理HTTP请求与响应的Java程序,分类包括继承HttpServlet类的Servlet、实现Servlet接口的Servlet。

15.3.2 HTTP请求与响应的处理

定义:HTTP请求与响应的处理是指Java Web应用中处理HTTP请求与响应的方法。
常用对象

  • HttpServletRequest:用于表示HTTP请求的对象。
  • HttpServletResponse:用于表示HTTP响应的对象。

常用方法

  • HttpServletRequest:
    • getParameter():获取请求参数。
    • getParameterValues():获取请求参数数组。
    • getMethod():获取请求方法。
    • getRequestURI():获取请求URI。
    • getSession():获取会话对象。
  • HttpServletResponse:
    • setContentType():设置响应类型。
    • getWriter():获取输出流。
    • sendRedirect():重定向到其他页面。
    • addCookie():添加Cookie。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;// 注解配置Servlet@WebServlet("/user")publicclassUserServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 设置响应类型 response.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = response.getWriter();// 输出响应内容 out.println("<html>"); out.println("<head>"); out.println("<title>User Information</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>User Information</h1>"); out.println("<p>Name: "+ request.getParameter("name")+"</p>"); out.println("<p>Age: "+ request.getParameter("age")+"</p>"); out.println("<p>Email: "+ request.getParameter("email")+"</p>"); out.println("</body>"); out.println("</html>");}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doGet(request, response);}}

输出结果

<html> <head> <title>User Information</title> </head> <body> <h1>User Information</h1> <p>Name: 张三</p> <p>Age: 25</p> <p>Email: [email protected]</p> </body> </html> 

✅ 结论:HTTP请求与响应的处理是指Java Web应用中处理HTTP请求与响应的方法,常用对象包括HttpServletRequest、HttpServletResponse。

15.4 会话管理

会话管理是用于处理Web应用中会话的机制。

15.4.1 Session的定义与使用

定义:Session是用于表示Web应用中会话的对象。
常用方法

  • setAttribute():设置会话属性。
  • getAttribute():获取会话属性。
  • removeAttribute():移除会话属性。
  • invalidate():销毁会话。
  • getMaxInactiveInterval():获取会话的最大不活动时间。
  • setMaxInactiveInterval():设置会话的最大不活动时间。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;// 注解配置Servlet@WebServlet("/login")publicclassLoginServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 获取请求参数String username = request.getParameter("username");String password = request.getParameter("password");// 验证用户if("admin".equals(username)&&"123456".equals(password)){// 登录成功,设置会话属性HttpSession session = request.getSession(); session.setAttribute("username", username);// 重定向到首页 response.sendRedirect("/index.jsp");}else{// 登录失败,重定向到登录页面 response.sendRedirect("/login.jsp");}}}// 首页Servlet@WebServlet("/index")publicclassIndexServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 获取会话属性HttpSession session = request.getSession();String username =(String) session.getAttribute("username");if(username !=null){// 设置响应类型 response.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = response.getWriter();// 输出响应内容 out.println("<html>"); out.println("<head>"); out.println("<title>Index</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Welcome, "+ username +"!</h1>"); out.println("<a href=\"/logout\">Logout</a>"); out.println("</body>"); out.println("</html>");}else{// 会话失效,重定向到登录页面 response.sendRedirect("/login.jsp");}}}// 登出Servlet@WebServlet("/logout")publicclassLogoutServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 销毁会话HttpSession session = request.getSession(); session.invalidate();// 重定向到登录页面 response.sendRedirect("/login.jsp");}}

输出结果
登录页面:

<html> <head> <title>Login</title> </head> <body> <h1>Login</h1> <form action="/login" method="post"> <label for="username">Username:</label> <input type="text" name="username" required> <br> <label for="password">Password:</label> <input type="password" name="password" required> <br> <input type="submit" value="Login"> </form> </body> </html> 

首页:

<html> <head> <title>Index</title> </head> <body> <h1>Welcome, admin!</h1> <a href="/logout">Logout</a> </body> </html> 

✅ 结论:Session是用于表示Web应用中会话的对象,常用方法包括setAttribute()、getAttribute()、removeAttribute()、invalidate()、getMaxInactiveInterval()、setMaxInactiveInterval()。

15.4.2 Cookie的定义与使用

定义:Cookie是用于表示Web应用中Cookie的对象。
常用方法

  • getName():获取Cookie的名称。
  • getValue():获取Cookie的值。
  • setValue():设置Cookie的值。
  • getMaxAge():获取Cookie的最大存活时间。
  • setMaxAge():设置Cookie的最大存活时间。
  • setPath():设置Cookie的路径。
  • setDomain():设置Cookie的域名。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;// 注解配置Servlet@WebServlet("/cookie")publicclassCookieServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 设置响应类型 response.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = response.getWriter();// 获取CookieCookie[] cookies = request.getCookies();String username =null;if(cookies !=null){for(Cookie cookie : cookies){if("username".equals(cookie.getName())){ username = cookie.getValue();break;}}}if(username !=null){ out.println("<html>"); out.println("<head>"); out.println("<title>Cookie Example</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Welcome, "+ username +"!</h1>"); out.println("<a href=\"/removeCookie\">Remove Cookie</a>"); out.println("</body>"); out.println("</html>");}else{// 设置CookieCookie cookie =newCookie("username","admin"); cookie.setMaxAge(3600); cookie.setPath("/"); response.addCookie(cookie); out.println("<html>"); out.println("<head>"); out.println("<title>Cookie Example</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Welcome, Guest!</h1>"); out.println("</body>"); out.println("</html>");}}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doGet(request, response);}}// 移除Cookie的Servlet@WebServlet("/removeCookie")publicclassRemoveCookieServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 移除CookieCookie cookie =newCookie("username",""); cookie.setMaxAge(0); cookie.setPath("/"); response.addCookie(cookie);// 重定向到Cookie示例页面 response.sendRedirect("/cookie");}}

输出结果
第一次访问:

<html> <head> <title>Cookie Example</title> </head> <body> <h1>Welcome, Guest!</h1> </body> </html> 

第二次访问:

<html> <head> <title>Cookie Example</title> </head> <body> <h1>Welcome, admin!</h1> <a href="/removeCookie">Remove Cookie</a> </body> </html> 

✅ 结论:Cookie是用于表示Web应用中Cookie的对象,常用方法包括getName()、getValue()、setValue()、getMaxAge()、setMaxAge()、setPath()、setDomain()。

15.5 过滤器与监听器的使用

过滤器与监听器是Java Web开发的重要技术。

15.5.1 过滤器的定义与使用

定义:过滤器是用于处理HTTP请求与响应的Java程序。
作用

  • 对请求进行过滤。
  • 对响应进行过滤。
  • 对请求与响应进行处理。

常用方法

  • doFilter():处理请求与响应。
  • init():初始化过滤器。
  • destroy():销毁过滤器。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebFilter;importjava.io.*;// 注解配置过滤器@WebFilter("/user/*")publicclassUserFilterimplementsFilter{@Overridepublicvoidinit(FilterConfig filterConfig)throwsServletException{System.out.println("UserFilter初始化");}@OverridepublicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsIOException,ServletException{// 设置响应类型 response.setContentType("text/html;charset=UTF-8");// 获取输出流PrintWriter out = response.getWriter();// 输出响应内容 out.println("<html>"); out.println("<head>"); out.println("<title>User Filter</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>User Filter</h1>");// 继续处理请求 chain.doFilter(request, response); out.println("</body>"); out.println("</html>");}@Overridepublicvoiddestroy(){System.out.println("UserFilter销毁");}}

输出结果

<html> <head> <title>User Filter</title> </head> <body> <h1>User Filter</h1> User Information <p>Name: 张三</p> <p>Age: 25</p> <p>Email: [email protected]</p> </body> </html> 

✅ 结论:过滤器是用于处理HTTP请求与响应的Java程序,常用方法包括doFilter()、init()、destroy()。

15.5.2 监听器的定义与使用

定义:监听器是用于监听Web应用中事件的Java程序。
作用

  • 监听ServletContext事件。
  • 监听HttpSession事件。
  • 监听ServletRequest事件。

常用方法

  • contextInitialized():ServletContext初始化事件。
  • contextDestroyed():ServletContext销毁事件。
  • sessionCreated():HttpSession创建事件。
  • sessionDestroyed():HttpSession销毁事件。
  • requestInitialized():ServletRequest初始化事件。
  • requestDestroyed():ServletRequest销毁事件。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebListener;importjavax.servlet.http.*;importjava.io.*;// 注解配置监听器@WebListenerpublicclassMyListenerimplementsServletContextListener,HttpSessionListener,ServletRequestListener{@OverridepublicvoidcontextInitialized(ServletContextEvent sce){System.out.println("ServletContext初始化");}@OverridepublicvoidcontextDestroyed(ServletContextEvent sce){System.out.println("ServletContext销毁");}@OverridepublicvoidsessionCreated(HttpSessionEvent se){System.out.println("HttpSession创建");}@OverridepublicvoidsessionDestroyed(HttpSessionEvent se){System.out.println("HttpSession销毁");}@OverridepublicvoidrequestInitialized(ServletRequestEvent sre){System.out.println("ServletRequest初始化");}@OverridepublicvoidrequestDestroyed(ServletRequestEvent sre){System.out.println("ServletRequest销毁");}}

输出结果

ServletContext初始化 ServletRequest初始化 HttpSession创建 ServletRequest销毁 HttpSession销毁 ServletContext销毁 

✅ 结论:监听器是用于监听Web应用中事件的Java程序,常用方法包括contextInitialized()、contextDestroyed()、sessionCreated()、sessionDestroyed()、requestInitialized()、requestDestroyed()。

15.6 Web开发的实际应用场景

在实际开发中,Web开发的应用场景非常广泛,如:

  • 实现用户的登录与登出。
  • 实现商品的展示与购买。
  • 实现订单的管理。
  • 实现博客的发布与管理。

示例

importjavax.servlet.*;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.*;importjava.io.*;importjava.util.*;// 产品类publicclassProduct{privateString productId;privateString productName;privatedouble price;privateint sales;publicProduct(String productId,String productName,double price,int sales){this.productId = productId;this.productName = productName;this.price = price;this.sales = sales;}publicStringgetProductId(){return productId;}publicStringgetProductName(){return productName;}publicdoublegetPrice(){return price;}publicintgetSales(){return sales;}@OverridepublicStringtoString(){return"Product{"+"productId='"+ productId +'\''+",+ productName +'\''+", price="+ price +", sales="+ sales +'}';}}// 产品服务类publicclassProductService{publicList<Product>getTopSellingProducts(String sql,int topN){// 数据库连接信息String url ="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false";String username ="root";String password ="123456";List<Product> products =newArrayList<>();try{// 1. 加载驱动程序Class.forName("com.mysql.jdbc.Driver");// 2. 建立数据库连接Connection connection =DriverManager.getConnection(url, username, password);System.out.println("数据库连接成功");// 3. 执行SQL语句PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, topN);ResultSet resultSet = preparedStatement.executeQuery();// 4. 处理结果集while(resultSet.next()){String productId = resultSet.getString("product_id");String productName = resultSet.getString("product_name");double price = resultSet.getDouble("price");int sales = resultSet.getInt("sales"); products.add(newProduct(productId, productName, price, sales));}// 5. 关闭资源 resultSet.close(); preparedStatement.close(); connection.close();}catch(ClassNotFoundException e){ e.printStackTrace();}catch(SQLException e){ e.printStackTrace();}return products;}}// 产品Servlet@WebServlet("/products")publicclassProductServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{// 创建产品服务对象ProductService productService =newProductService();// 定义SQL语句String sql ="SELECT * FROM product ORDER BY sales DESC LIMIT ?";// 获取销量top3的产品List<Product> topSellingProducts = productService.getTopSellingProducts(sql,3);// 设置请求属性 request.setAttribute("topSellingProducts", topSellingProducts);// 转发到产品页面RequestDispatcher dispatcher = request.getRequestDispatcher("/products.jsp"); dispatcher.forward(request, response);}@OverrideprotectedvoiddoPost(HttpServletRequest request,HttpServletResponse response)throwsServletException,IOException{doGet(request, response);}}// 产品页面<%@ page contentType="text/html;charset=UTF-8" language="java"%><html><head><title>Products</title></head><body><h1>Top3SellingProducts</h1><table border="1"><tr><th>Product ID</th><th>ProductName</th><th>Price</th><th>Sales</th></tr><%List<Product> topSellingProducts =(List<Product>) request.getAttribute("topSellingProducts");for(Product product : topSellingProducts){%><tr><td><%= product.getProductId()%></td><td><%= product.getProductName()%></td><td><%= product.getPrice()%></td><td><%= product.getSales()%></td></tr><%}%></table></body></html>

输出结果

Top 3 Selling Products Product ID Product Name Price Sales P004 手表 500.0 200 P005 耳机 300.0 150 P001 手机 1000.0 100 

✅ 结论:在实际开发中,Web开发的应用场景非常广泛,需要根据实际问题选择合适的Web开发方法。

总结

本章我们学习了Java Web开发基础与Servlet核心技术,包括Web应用的结构、Servlet的定义与使用、HTTP请求与响应的处理、会话管理、过滤器与监听器的使用,学会了在实际开发中处理Web应用问题。其中,Web应用的结构(目录结构、配置文件)、Servlet的定义与使用(Servlet接口、HttpServlet类、注解配置)、HTTP请求与响应的处理(Request、Response对象)、会话管理(Session、Cookie)、过滤器与监听器的使用、Web开发的实际应用场景是本章的重点内容。从下一章开始,我们将学习Java的框架使用、开发工具等内容。

Read more

第十六届蓝桥杯省赛(软件类真题)C/C++ 大学A组

第十六届蓝桥杯省赛(软件类真题)C/C++ 大学A组

大纲: A.寻找质数 B:黑白棋 题目&解析&代码 A题 题目解析 本题的目标是枚举质数并计数,直到数到第2025个。由于2025不算太大,第2025个质数大约在17000~18000之间,完全可以在合理时间内通过简单枚举得到。 解题步骤: 从2开始遍历每个整数,判断它是否是质数。 质数判断采用试除法:对于一个数n,只需检查从2到√n的所有整数是否能整除n。若存在能整除的数,则n不是质数;否则是质数。 每找到一个质数,计数器加1。 当计数器达到2025时,输出当前的质数并结束。 优化点: 除了2以外,偶数不可能是质数,因此可以跳过偶数判断(直接步进2)。 在isPrime函数中,可以先处理特殊情况(n<2返回false),然后单独判断偶数,再对奇数进行试除,步进也可以设为2。 C++ 参考代码 以下代码实现了上述算法,并输出第2025个质数。 cpp

By Ne0inhk
计算机Java毕设实战-基于springboot的留守儿童关爱网站首页展示、宣传新闻、志愿活动、爱心捐赠【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Java毕设实战-基于springboot的留守儿童关爱网站首页展示、宣传新闻、志愿活动、爱心捐赠【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围::小程序、SpringBoot、SSM、JSP、Vue、PHP、Java、python、爬虫、数据可视化、大数据、物联网、机器学习等设计与开发。 主要内容:免费开题报告、任务书、全bao定制+中期检查PPT、代码编写、🚢文编写和辅导、🚢文降重、长期答辩答疑辅导、一对一专业代码讲解辅导答辩、模拟答辩演练、和理解代码逻辑思路。 特色服务内容:答辩必过班 (全程一对一技术交流,帮助大家顺利完成答辩,小白必选) 全网粉丝50W+,累计帮助2000+完成优秀毕设 🍅文末获取源码🍅 感兴趣的可以先收藏起来,还有大家在毕设选题,

By Ne0inhk
C++ 运算符重载:自定义类型的运算扩展

C++ 运算符重载:自定义类型的运算扩展

C++ 运算符重载:自定义类型的运算扩展 💡 学习目标:掌握运算符重载的核心语法与规则,能够为自定义类型重载常用运算符,实现类对象的灵活运算。 💡 学习重点:运算符重载的基本形式、成员函数与全局函数重载的区别、常见运算符的重载实现、禁止重载的运算符。 一、运算符重载的概念与核心价值 ✅ 结论:运算符重载是 C++ 静态多态的重要体现,允许为自定义类型(如类、结构体)重新定义运算符的行为,让自定义对象可以像内置类型一样使用运算符。 运算符重载的核心价值: 1. 简化代码书写:用直观的运算符替代繁琐的成员函数调用,提升代码可读性 2. 统一操作风格:让自定义类型的运算逻辑与内置类型保持一致,降低学习和使用成本 3. 扩展类型功能:根据业务需求定制运算符的行为,满足自定义类型的运算需求 ⚠️ 注意事项:运算符重载不会改变运算符的优先级和结合性,也不会改变运算符的操作数个数。 二、运算符重载的基本语法 运算符重载的本质是函数重载,分为成员函数重载和全局函数重载两种形式。 2.1 成员函数重载语法 将运算符重载函数定义为类的成员函数,语法格式如下: class

By Ne0inhk

JavaScript Window Location

JavaScript Window Location 引言 在Web开发中,window.location 对象是浏览器窗口中的一个重要属性,它提供了访问当前URL的接口。理解并正确使用 window.location 对象对于开发动态网页和应用程序至关重要。本文将详细介绍 window.location 对象的属性、方法以及如何在JavaScript中操作它们。 window.location 对象概述 window.location 是一个对象,包含了浏览器当前加载页面的URL信息。它允许开发者读取和修改URL,从而实现页面跳转、获取查询参数等功能。 属性 以下是 window.location 对象的一些常用属性: * href: 返回当前页面的完整URL。 * protocol: 返回当前页面的协议(例如:http, https)。 * host: 返回当前页面的域名和端口号。 * hostname: 返回当前页面的域名。 * port: 返回当前页面的端口号。 * pathname: 返回当前页面的路径。 * search: 返回当前页面的查询

By Ne0inhk