java-web

Mave

问题

  1. 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>
  1. 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>
    
  2. 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

项目结构
  1. 新建空的maven项目,删除src目录
  2. 新建model,maven的webapp模板,在main下新建java,设为Sources Root,新建resources设为Resources Root
  3. 修改WEB_INF/web.xml为最新,项目结构完成
servlet

-HelloServlet ---extends-- HttpServlet---extends---GenericServlet----immplents----Servlet

  1. 右键新建servlet,重写doGet和doPost方法
  2. 编写servlet映射,是为了给配置一个路径然后在可以通过浏览器去访问
  3. 配置tomcat,配置项目路径
servlet生命周期
  1. 默认第一次请求时,执行init,

    可以在标签下配置,>=0时,服务器启动时init

    servlet单例,init只执行一次

  2. 提供服务执行service方法,每次访问Servlet时,Service方法都会被调用一次

  3. servlet被销毁时执行destroy。服务器关闭时,Servlet被销毁,服务器正常关闭时,才会执行destroy方法。

Mapping映射

  1. 一个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>
    
  2. 映射通用

    <servlet-mapping>
    	<servlet-name>helloServlet</servlet-name>
    	<url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
  3. 默认请求路径

    <!--这样就不会访问到主页,所有请求会到同一页面-->
    <servlet-mapping>
    	<servlet-name>helloServlet</servlet-name>
    	<url-pattern>/*</url-pattern>
    </servlet-mapping>
    
  4. 自定义后缀映射

    <!--*前面不能加任何路径-->
    <servlet-mapping>
    	<servlet-name>helloServlet</servlet-name>
    	<url-pattern>*.jpy</url-pattern>
    </servlet-mapping>
    
  5. 优先级问题

    先走固有的,找不到走默认的

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);
    
posted @   jpy  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· 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
点击右上角即可分享
微信分享提示