servlet学习_days_05

拦截器

  • 拦截器一般是用来决定servlet要不要执行,怎末执行
  • 拦截器是拦截请求并且在servlet之前执行动作逻辑的一种组件
  • 其实拦截器就是看你有没有能力执行下一个逻辑单元。
  • Filter在服务器一启动的时候就直接加载。

拦截器的常用方法:

1、初始化方法

 public void init(FilterConfig filterConfig) throws ServletException {
        filterConfig.getInitParameter(String s);		//获取web.xml中的初始化信息
    }

2、具体的拦截方法

/**这里的ServletRequest servletRequest和ServletResponse servletResponse其实就是
     * HttpServletRequest和HttpServletResponse,只不过类型没有转换而已。
     */
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;           //类型转换
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        
    }

3、直接放过和不放过

filterChain.doFilter(request, response);			//直接放过
response.sendRedirect("hello.html");			//不放过

这里不放过里面的是某一页面或servlet,例如登录页面

4、销毁方法

 public void destroy() {

 }

5、web.xml中的配置

<filter>
        <filter-name>loginfilter</filter-name>			//映射名
        <filter-class>控制器.LoginFilter</filter-class>			//拦截器具体实现的类
    </filter>

    <filter-mapping>
        <filter-name>loginfilter</filter-name>			//映射名
        <url-pattern>*.do</url-pattern>				//拦截所有.do的servlet。
    </filter-mapping>

注意这里拦截器也会拦截html的,所以直接打*是会拦截所有页面的,如果具体想
拦截某一个servlet,就写上具体的映射名

 <url-pattern></url-pattern>		//写上具体的映射名

这里可以看一个简单的配置,不在web.xml配置的方式。

@WebFilter("test.do")			//注解式开发,拦截test.do
@WebInitParam(name = "username", value = "url")			//设置初始化参数

文件上传

  • 文件上传一般不会用异步请求发送,一般都是同步请求发送文件
  • 文件上传,绝对不用Get请求发送,一定使用Post请求发送(如果用Get请求,你要将文件的字节流缀在URL后面,大一点的文件就被写死了,有限制,而且还贼长)

1、前端设置文件上传

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <!--enctype="multipart/form-data:改变编码格式,将file改成多媒体文件格式往外发-->
    <form action="test.do" method="post" enctype="multipart/form-data">
        文件:<input type="file" name="myfile">
        <input type = text name="fileRename">
        <input type = "submit">
    </form>
</body>
</html>

这里注意:

enctype="multipart/form-data:改变编码格式,将file改成多媒体文件格式往外发,不然发的还是字符。

2、浏览器此时的状态

在这里插入图片描述

3、服务器接受文件,并写到指定路径下去

@WebServlet("/test.do")
@MultipartConfig
//证明该Servlet 可以接受文件
public class FileUplodeController extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        //文件接收用Part接收
        Part part = req.getPart("myfile");
        //字符接收用getParameter()
        String rename = req.getParameter("fileRename");
        //在"E:/shiruntao/" 路径下,接收上传的文件
        //part.getSubmittedFileName() 获取文件名
        FileOutputStream fos = new FileOutputStream("E:/shiruntao/" + part.getSubmittedFileName());
        InputStream is = part.getInputStream();
        byte[] b = new byte[is.available()];
        is.read(b);
        fos.write(b);
        //resp.getWriter().write("文件上传成功");

    }
}

这里注意:

  1. @MultipartConfig一定要写上,证明该Servlet 可以接受文件。服务器接收文件之后都会存在Part中,所以用req.getPart( from表单中的key值) 、part.getSubmittedFileName() 获取上传的文件名,获得到对应的文件,然后用IO流写到指定文件中去。
  2. 将是上传的文件设置到项目发布的路径中
String s = req.getServletContext().getRealPath("");			//通过这个找到项目发布的真实路径
FileOutputStream fos = new FileOutputStream(s + "img/" + part.getSubmittedFileName());			//将文件写入项目发布的路径中
byte[] b = new byte[is.available()];
is.read(b);
fos.write(b);

执行结果:

在这里插入图片描述
这个动作一般应用于用户上传头像,我们要把用户信息保存在数据库中,而将一张图片保存在数据库中是不容易的,所以我们将图片的路径信息保存在数据库中就OK了。


文件下载

1、先从服务器中读出文件

FileInputStream is = new FileInputStream("E:/shiruntao/局域网.PNG");
byte[] b = new byte[is.available()];
is.read(b);

2、告诉浏览器上传的是一个文件

resp.setHeader("Content-Disposition", "attachment; filename=hhh.png");			//hhh.png:设置的下载后的名字	

3、向浏览器写出文件

OutputStream os = resp.getOutputStream();
os.write(b);

OK,Servlet体系就告一段落了…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值