IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 深度好文之Servlet技术详解(十)注解&文件上传 -> 正文阅读

[Java知识库]深度好文之Servlet技术详解(十)注解&文件上传

目录

一.基于注解式开发Servlet

1.@WebServlet

2.@WebInitParam

?二.文件上传

1.方式一(配置web.xml)

2.方式二(配置注解)


一.基于注解式开发Servlet

1.@WebServlet

Servlet3.0 以及之后的版本中支持注解式开发 Servlet 。对于Servlet 的配置不在依赖于 web.xml 配置文件,而是使用 @WebServlet 注解完成 Servlet 的配置, 可以有效对web.xml进行瘦身,不再臃肿

上面的参数也都可以在web.xml里设置。

AnnotationServlet.java:

package com.first.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

//因为一个servlet可以对应于多个url,所以urlPatterns是String[]类型
//我这里用了扩展名匹配和路径匹配
@WebServlet(urlPatterns = {"*.do","/test/*"})
public class AnnotationServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter pw=resp.getWriter();
        pw.println("Annotation Servlet!");
        pw.flush();
        pw.close();
    }
}

输出:

以下列地址做测试:

测试 *.do

http://localhost:8888/ajaxDemo/sb.do

http://localhost:8888/ajaxDemo/rain.do

测试 /suibian/*

http://localhost:8888/ajaxDemo/test

http://localhost:8888/ajaxDemo/test/

http://localhost:8888/ajaxDemo/test/abc.de?

http://localhost:8888/ajaxDemo/test/cloud/abc.de?

上面测试的地址结果都一样,可见设置成功!

2.@WebInitParam

作用:为servlet配置初始化参数,例如之前在web.xml中配置的<init-param>

?

?InitParamServlet.java:

package com.first.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletResponse;

/*
路径设置为精确匹配,原来在web.xml怎么写的这里还怎么写;
为servlet设置参数,参数只有只读的需求时也可以设置成员变量;
设置自启动(即Tomcat启动时启动此servlet,优先级设置为1,优先级数越小优先级越大)
 */
@WebServlet(urlPatterns = "/initParam.do",
        initParams = {@WebInitParam(name = "key1",value = "深情"),
                @WebInitParam(name = "key2",value = "也不变")},
        loadOnStartup = 1 )
public class InitParamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletConfig
        ServletConfig servletConfig=this.getServletConfig();
        String value1=servletConfig.getInitParameter("key1");
        String value2=servletConfig.getInitParameter("key2");

        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        pw.println(value1);
        pw.println(value2);
        pw.flush();
        pw.close();
    }

    @Override
    public void init() throws ServletException {
        //获取ServletConfig
        ServletConfig servletConfig=this.getServletConfig();
        String value1=servletConfig.getInitParameter("key1");
        String value2=servletConfig.getInitParameter("key2");
        System.out.println(value1);
        System.out.println(value2);
    }
}

输出:

控制台输出:

深情
也不变

浏览器输出:

?二.文件上传

Servlet3.0 之前的版本中如果实现文件上传需要依赖 apache 的Fileupload 组件,在 Servlet3.0 以及之后的版本中提供了 Part 对象处 理文件上传,所以不在需要额外的添加 Fileupload 组件。
Servlet3.0 以及之后的版本中实现文件上传时必须要在 Servlet 开启多参数配置:

1.方式一(配置web.xml)

通过配置web.xml来实开启Part对象的功能:
<multipart-config>
 ? ?<file-size-threshold></file-size-threshold>
 ? ?<location></location>
 ? ?<max-file-size></max-file-size>
 ? ?<max-request-size></max-request-size>
</multipart-config>
eg:
在之前自启动的servlet的web.xml里配置,相关配置的位置有硬性要求,即必须放在<servlet>标签里的最下面,而且如果不需配置参数的话,可以省略那四个参数

?

?

2.方式二(配置注解)

通过配置注解的方式开启Part对象的功能

@MultipartConfig

?

Part 对象中常用的方法
long getSize()
上传文件的大小
String getSubmittedFileName()
上传文件的原始文件名
String getName()
获取 <input name="upload" ...> 标签中 name 属性值
InputStream getInputStream()
获取上传文件的输入流
void write(String path)
保存文件至服务器

get方法提交表单只能以字符方式提交,而post方式提交表单可以是字符也可以是字节, 默认是字符。例如图片,影音等只能通过字节方式传送。

在web目录下创建fileUpload.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!-- enctype="multipart/form-data"把post方式从字符型改为字节型-->
    <form action="fileUpload.do" method="post" enctype="multipart/form-data">
<!--        文件描述是字符型内容,但这里已经设置了字节型post,所以也以字节呈现-->
        文件描述:<input type="text" name="desc"><br>
<!--        上传文件是字节型内容-->
      上传文件:<input type="file" name="file"><br>
        <input type="submit" value="OK">
    </form>
</body>
</html>

FileUploadServlet.java:

package com.first.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.UUID;

/*
文件上传
 */
//当配置信息中只有一个urlPatterns,那么可以省略urlPatterns = ,而直接填写url
@WebServlet("/fileUpload.do")
//开启多参数配置,使能够使用Part对象
@MultipartConfig

public class FileUploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        //获取文件描述
        String desc =req.getParameter("desc");
        //获取上传文件
        Part part=req.getPart("file");
        //处理文件名,防止客户端上传文件重名
        //UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
        //加号前面是生成一个随机id,重复概率极低;加号后面是文件后缀名(如 .txt)
        String newName = UUID.randomUUID().toString()+part.getSubmittedFileName().substring(part.getSubmittedFileName().lastIndexOf("."));

        ServletContext servletContext=this.getServletContext();
        //相对路径转化为绝对路径
        String realPath=servletContext.getRealPath("image/"+newName);
        System.out.println("文件已经上传到 : "+realPath);

        //文件的保存,上传
        part.write(realPath);

        resp.setContentType("text/plain;charset=utf-8");
        PrintWriter pw=resp.getWriter();
        pw.println(desc);
        pw.flush();
        pw.close();
    }
}

?

输出:

查看上传到服务器的文件不是在项目目录里查看,而是到Tomcat的安装目录下的本项目目录下的相应文件夹下查看,如下,可看到,上传成功!

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:04:09  更:2022-05-05 11:05:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:08:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码