java-web
Mave
问题
-
idea中maven项目默认生成的web.xml文件头从tomcat中root中复制头出来,版本变为4.0
<?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" metadata-complete="true"> </web-app>
Servlet
依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
-
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" metadata-complete="true"> <!--注册servlet--> <servlet> <servlet-name>helloServlet</servlet-name> <servlet-class>com.moral.HelloServlet</servlet-class> </servlet> <!--一个servlet对应一个mapping--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <!--请求路径,hello会映射到com.moral.HelloServlet,会调用器doGet/doPost--> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app>
-
Servlet
//用了@WebServlet就不用web.xml配置访问路径了 //@WebServlet(name = "HelloServlet",value="/hello") public class HelloServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //响应类型 response.setContentType("text/html"); //获取响应的输出流 PrintWriter out = response.getWriter(); out.println("nihao"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
java-web
项目结构
- 新建空的maven项目,删除src目录
- 新建model,maven的webapp模板,在main下新建java,设为Sources Root,新建resources设为Resources Root
- 修改WEB_INF/web.xml为最新,项目结构完成
servlet
-HelloServlet ---extends-- HttpServlet---extends---GenericServlet----immplents----Servlet
- 右键新建servlet,重写doGet和doPost方法
- 编写servlet映射,是为了给配置一个路径然后在可以通过浏览器去访问
- 配置tomcat,配置项目路径
servlet生命周期
-
默认第一次请求时,执行init,
可以在
标签下配置 ,>=0时,服务器启动时init servlet单例,init只执行一次
-
提供服务执行service方法,每次访问Servlet时,Service方法都会被调用一次
-
servlet被销毁时执行destroy。服务器关闭时,Servlet被销毁,服务器正常关闭时,才会执行destroy方法。
Mapping映射
-
一个servlet可以映射多个路径,通配符
<servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello1</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping>
-
映射通用
<servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
-
默认请求路径
<!--这样就不会访问到主页,所有请求会到同一页面--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
自定义后缀映射
<!--*前面不能加任何路径--> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <url-pattern>*.jpy</url-pattern> </servlet-mapping>
-
优先级问题
先走固有的,找不到走默认的
ServletContext
web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,代表了当前的web应用
共享数据
一个servelet保存的数据可以在另一个Servlet中拿到
Servlet1 存
ServletContext context = this.getServletContext();
context.setAttribute("username","jpy");//数据存入servletContext
Servlet2 取
ServletContext context = this.getServletContext();
context.getAttribute("username");//取
获取初始化参数
存:
<!--设置初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>www.baidu.com</param-value>
</context-param>
取:
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
请求转发
ServletContext context = this.getServletContext();
context.getRequestDispatcher("/getParameter").forward(request,response);
读取资源文件
Properties
java和resources都新建properties文件,默认值能导出resources下文件,要想导出java下的properties。可以在pom.xml中配置,需刷新pom依赖
思路:需要文件流
<build>
<!--默认开启,可以不配-->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
@WebServlet(name = "HelloServlet")
public class HelloServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//因为服务器上的配置文件绝对路径不容易拿到,而生成的配置文件都会在/WEB_INF/classes下
InputStream is = this.getServletContext().getResourceAsStream("/WEB_INF/classes/123.properties");
Properties properties = new Properties();
properties.load(is);
String username = properties.getProperty("username");
String password = properties.getProperty("password");
response.getWriter().print(username + "==" + password);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
Response
1.简单分类
发送数据
PrintWriter getWriter() throws IOException;
ServletOutputStream getOutputStream() throws IOException;
响应头
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
响应状态码
2.常见应用
-
向浏览器输出信息
-
下载文件
- 路径
- 文件名
- 设置让浏览器能够支持下载我们要的资源
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
@Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //- 路径 String realPath = "D:\\tools\\java-web\\res\\target\\res\\WEB-INF\\classes\\你好.png"; //- 文件名 String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1); //- 设置让浏览器能够支持下载我们要的资源,URLEncoder.encode防止中文文件名乱码 resp.setHeader("Content-Disponsition", "attachment; filename=" + URLEncoder.encode(fileName,"utf-8")); //- 获取下载文件的输入流 FileInputStream fis = new FileInputStream(realPath); //- 创建缓冲区 int len = 0; byte[] buffer = new byte[1024]; //- 获取OutputStream对象 ServletOutputStream os = resp.getOutputStream(); //- 将FileOutputStream流写入到buffer缓冲区 //- 使用OutputStream将缓冲区中的数据输出到客户端 while ((len = fis.read(buffer)) != -1) { os.write(buffer, 0, len); } os.close(); fis.close(); }
-
重定向
状态码:302
例:项目路径/hello,重定向到/index.jsp,必须写出/hello/index.jsp
而request转发不需要,此时/代表当前项目,直接写成:/index.jsp
void sendRedirect(String var1) throws IOException; //重定向 resp.sendRedirect("");
Request
-
获取前端参数
//获取前端数据 req.getParameter(""); //获取前端多选框数据 req.getParameterValues("");
-
请求转发
状态码:307
//请求转发 req.getRequestDispatcher("/index.jsp").forward(req, resp);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY