初学Servle(下)

143 阅读3分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战」。

url-pattern

1、完全匹配

<url-pattern>/hello.html</url-pattern>

2、目录匹配

<url-pattern>/admin/hello/*</url-pattern>

3、扩展名匹配

<url-pattern>*.html</url-pattern>

4、缺省匹配  

找不到匹配的url-pattern后,匹配到这个

<url-pattern>/</url-pattern>

HTTP响应

1 HTTP重定向

image.png

1)重定向会产生2次请求

2)重定向后url地址变化

3)重定有三种方法实现

//        重定向方式一

//        resp.setStatus(resp.SC_MOVED_TEMPORARILY);

//        resp.setHeader("Location","www.baidu.com");  //注意添加http

//        resp.setHeader("Location","/myservlet/RedirectServlet");

//        重定向方式二

//        resp.sendRedirect("/myservlet/RedirectServlet");

//        重定向方式三  定时刷新,5秒后刷新,重定向到url

            resp.setHeader("refresh","5;url=/myservlet/RedirectServlet");

2 HTTP转发

image.png

1)只有一次请求,

2)原地址不变化。注意这里因为是服务器内部转发,路径不需要添加应用的名称

3)转发的实现方法:

RequestDispatcher dispatcher = req.getRequestDispatcher("/ForwardServlet");

dispatcher.forward(req,resp);

image.png

image.png

Cookie和Session

1、Cookie

Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。

HTTP cookie 流程:

  •  服务器脚本发送一系列 cookie 至浏览器。比如名字,ID 等等用户信息。

  •  浏览器在本地机中存储这些信息。

  •  当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户等。

创建Cookie步骤:

1)创建一个Cookie对象

Cookie cookie = new Cookie("cookie_username",name);

2)设置有效时间(单位为秒):

cookie.setMaxAge(30); //设置有效时间,单位秒,默认-1,即关闭浏览器失效。

3)将cookie发送至HTTP响应头中

resp.addCookie(cookie);

4)获取cookie信息

Cookie[] cookies = req.getCookies();
for (int i = 0; i < cookies.length; i++){
Cookie cookie = cookies[i];
System.out.println("AdminHomeServlet cookie:"
+cookie.getName()+",value="+cookie.getValue()
+",maxage="+cookie.getMaxAge());
}

 

比如:在AdminLoginServlet登录时把用户信息保存在一个cookie中,然后AdminHomeServlet获得。

 

2、Session:

保存用户信息到session中:

HttpSession session = req.getSession();
session.setMaxInactiveInterval(30);//设置有效时间,单位秒,默认30分钟
session.setAttribute("username",name);

获取Session中的信息:

String username = (String)req.getSession().getAttribute("username");

从session中移除某个属性:

req.getSession().removeAttribute("username");

清除session:

req.getSession().invalidate();//将session无效化  

session和cookie的最大区别:

session信息保存在服务器

cookie信息保存在客户端

所以,session比较安全,cookie不安全。但是session会占用服务器资源,影响服务器性能。

JSP页面获取信息:

1、发送数据到 request 里面

//发送到request里面
req.setAttribute("admin",admin);
req.setAttribute("books",books);
//使用转发,注意:这里使用重定向后,rep没有数据,只能使用转发
req.getRequestDispatcher("/homepage.jsp").forward(req,resp);

2、页面获取并显示

1)使用<%=%>

<%Admin admin=(Admin)request.getAttribute("admin");%>
<%=admin.getUsername()%>

2)使用EL&JSTL

1)官方下载地址:

archive.apache.org/dist/jakart…

选择jakarta-taglibs-standard-1.1.2.zip 下载

2)下载后解压,将解压出来的lib文件夹里的jstl.jar和standard.jar包放进去

3)在JSP页面中添加指令

       <%@ taglib uri="java.sun.com/jsp/jstl/co…" prefix="c" %>

//格式化日期

<%@ taglib uri="java.sun.com/jsp/jstl/fm…" prefix="fmt" %>

4)可选:如何jsp页面标红

file->settings->Languages & Frameworks 下的 Schemas and DTDs,点击右上角的+号,URI的地址:java.sun.com/jsp/jstl/co…,

image.png 1)使用:

<c:forEach var="book" items="${books}">\
    <tr><td>\
        <input type="checkbox" name="ids" value="${book.id}"></td>\
        <td>${book.bookname}</td>\
        <td>${book.author}</td>\
        <td>${book.type}</td>\
        <td>${book.remainqty}</td>\
        <td>\
        <a href="/admin/delbook?id=${book.id}" >删除</a>   <a href="/admin/updatebook?id=${book.id}" >编辑</a>\
    </td>\
    </tr>\
</c:forEach>

<fmt:formatDate value="${date}" pattern="yyyy-MM-dd"/>--%>

上传文件

1、在页面上面,form 表单里面添加属性enctype="multipart/form-data"

比如:

<form name="frm" method="post" enctype="multipart/form-data">

2、添加文件选择框:

<input type="file" name="uploadFile">

3、添加上传文件需要的包:

commons.apache.org/proper/comm…

image.png commons-fileupload-1.4.jar

以及依赖包:

commons-io-2.2.jar

4、编写代码:

在homepage.jsp页面:

<form name="frm" method="post" action="/user/uploadpicture" enctype="multipart/form-data">\
    <input type="file" name="uploadFile"><br>\
    <input type="submit" value="上传">\
</form>

然后添加一个servlet处理上传文件

package com.hwadee.train.servlet;\
\
\
import org.apache.commons.fileupload.FileItem;\
import org.apache.commons.fileupload.disk.DiskFileItemFactory;\
import org.apache.commons.fileupload.servlet.ServletFileUpload;\
import javax.servlet.annotation.WebServlet;\
import javax.servlet.http.HttpServlet;\
import javax.servlet.http.HttpServletRequest;\
import javax.servlet.http.HttpServletResponse;\
import java.io.File;\
import java.io.IOException;\
import java.util.List;\
\
\
@WebServlet("/user/uploadpicture")\
public class UserUploadPictureServlet extends HttpServlet {\
    @Override\
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {\
        System.out.println("测试:UserUploadPictureServlet doPost");\
        // 这个路径相对当前应用的目录\
        String uploadPath = req.getServletContext().getRealPath("./")\
                + File.separator + "upload"+ File.separator +"imgs";\
        // 如果目录不存在则创建\
        File uploadDir = new File(uploadPath);\
        if (!uploadDir.exists()) {\
            uploadDir.mkdir();\
        }\
        // 配置上传参数\
        DiskFileItemFactory factory = new DiskFileItemFactory();\
//        // 设置临时存储目录\
//        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));\
        ServletFileUpload upload = new ServletFileUpload(factory);\
        try {\
            // 解析请求的内容提取文件数据\
            @SuppressWarnings("unchecked")\
            List<FileItem> formItems = upload.parseRequest(req);\
            if (formItems != null && formItems.size() > 0) {\
                // 迭代表单数据\
                for (FileItem item : formItems) {\
                    // 处理不在表单中的字段\
                    if (!item.isFormField()) {\
                        String fileName = new File(item.getName()).getName();\
                        String filePath = uploadPath + File.separator + fileName;\
                        File storeFile = new File(filePath);\
                        // 在控制台输出文件的上传路径\
                        System.out.println(filePath);\
                        // 保存文件到硬盘\
                        item.write(storeFile);\
                        }\
                }\
            }\
        } catch (Exception ex) {\
            req.setAttribute("message",\
                    "错误信息: " + ex.getMessage());\
        }\
        resp.sendRedirect("/homepage.jsp");\
    }\
}