「这是我参与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重定向
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转发
1)只有一次请求,
2)原地址不变化。注意这里因为是服务器内部转发,路径不需要添加应用的名称
3)转发的实现方法:
RequestDispatcher dispatcher = req.getRequestDispatcher("/ForwardServlet");
dispatcher.forward(req,resp);
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…,
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…
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");\
}\
}