目录
一.基于注解式开发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的安装目录下的本项目目录下的相应文件夹下查看,如下,可看到,上传成功!
?
|