JavaWeb知识点汇总
监听器
一、分类
1.监听ServletContext事件
- ServletContextListener(监听ServletContext生命周期的:从创建到销毁的过程(服务器启动创建,服务器停止销毁))
- ServletContextAttributeListener(监听ServletContext域中属性的变化)
2.监听HttpSession事件
- HttpSessionListener(监听HttpSession生命周期的(第一次要使用session对象时创建,30分钟后自动销毁或手动销毁)
- HttpSessionAttributeListener(监听所有对象在HttpSession域中属性的变化)
- HttpSessionActivationListener(监听某个对象HttpSession活化钝化的)
- HttpSessionBindingEvent(监听某个对象(绑定)到HttpSession中和从session中(解绑))
3.监听ServletRequest事件
- ServletRequestListener(监听ServletRequest生命周期的(每接受到一个请求就创建,当请求结束时销毁))
- ServletRequestAttributeListener(监听ServletRequest域中属性的变化)
二、Session
- 当客户端浏览器发生关闭后,再次使用session对象时,会新创建一个对象(session的实现依靠的是cookie,而cookie默认情况下关闭浏览器就销毁)
关于Session的活化与钝化,需要注意在idea中,钝化的session文件默认是在work文件下的,如是work文件夹会随着服务器的启动删除,从而使得先钱保存的session数据丢失,因此可以在idea中关于tomcat的配置勾选Preserve sessions across restarts and reploys
三、使用场景
ServletContextListener :服务器启动做项目的域初始化操作,停止后做善后清理工作
HttpSessionBindingListener:监听某个对象绑定到session域中,比如在线人数
国际化
基本使用
- 编写多语言文件(名称 _ 语言代码 _ 国家代码.properties)
- 使用Locale获取位置信息
- 使用ResourceBundle获取具体的信息
Locale的创建方式是有区别的
<%@ page import="java.util.Locale" %>
<%@ page import="java.util.ResourceBundle" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
String str = request.getHeader("Accept-Language").split(",")[0];
String language = str.split("-")[0];
Locale locale = null;
// System.out.println(language);
if (language.equals("zh")) {
// locale = new Locale("zh", "CN");
locale = Locale.CHINA;
} else if (language.equals("en")) {
// locale = new Locale("en", "US");
locale = Locale.ENGLISH;
System.out.println("en");
}
ResourceBundle bundle = ResourceBundle.getBundle("directory", locale);
String username = bundle.getString("username");
String password = bundle.getString("password");
String login = bundle.getString("login");
%>
<%=username%> <input type="text">
<%=password%> <input type="password">
<input type="submit" value="<%=login %>">
</body>
</html>
格式化
- 日期格式化
- 货币格式化
- 数字格式化
- 自定义消息格式化
注意
- 区分getAttribute和getParameter
文件上传与下载
注意:
- 使用多部件上传时,要设置html页面的enctype为multidata/form-data
- 在使用maven项目导包时,可能会出现ClassForNameNoFound等异常,记得在WEB-INF目录下创建lib文件夹,放入所需的jar包
多部件上传流内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-98IlycNt-1615077735035)(C:\Users\ASUS\Desktop\多部件.png)]
#文件上传
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决文件上传时的乱码问题
req.setCharacterEncoding("UTF-8");
try {
if (ServletFileUpload.isMultipartContent(req)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> fileItems = upload.parseRequest(req);
Iterator<FileItem> iterator = fileItems.iterator();
while (iterator.hasNext()) {
FileItem item = iterator.next();
if (item.isFormField()) {
String name = item.getFieldName();
// 获取文件名 这里不适用
// String test = item.getName();
String value = item.getString();
System.out.println(" name:" + name + " value:" + value);
} else {
//通过req.getServletContext().getRealPath("/picture")来获取真实路径
String path = req.getServletContext().getRealPath("picture");
File pictures = new File(path);
//若文件夹不存在,则创建
if (!pictures.exists()) {
pictures.mkdirs();
}
InputStream inputStream = item.getInputStream();
System.out.println("文件名称:" + item.getName());
//使用UUID区分一致性
String fileName = UUID.randomUUID().toString() + item.getName();
FileOutputStream filterOutputStream = new FileOutputStream(path + "\\" + fileName);
IOUtils.copy(inputStream, filterOutputStream);
filterOutputStream.close();
inputStream.close();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
文件下载
//获取文件名
String fileName = req.getParameter("fileName");
//获取真实路径
String realPath = req.getServletContext().getRealPath("/picture/" + fileName);
//解决服务器端乱码问题
fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
//设置响应头
resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);
//获取输入流
FileInputStream fileInputStream = new FileInputStream(realPath);
//获取输出流
ServletOutputStream outputStream = resp.getOutputStream();
//commmons-io下的工具类
IOUtils.copy(fileInputStream, outputStream);
乱码问题:
对于get请求 所有的请求参数都是带在url地址上
Tomcat的默认编码为iso-8859-1
服务端的解码原理 username = new String(username.getBytes("ISO-8859-1"),"UTF-8");
可以直接设置tomcat的编码原理 URIEncoding="UTF-8"
对于post请求,
设置请求体的编码
在得到数据之前,使用request.setCharacterEncoding()解码
响应
response.setContentType("text/html;charset=utf-8");
JSP
Tomcat处理jsp页面
在Toncat服务器中存在两个重要的Servlet
DefaultServlet : 处理静态资源
JSPServlet : 处理*.jsp请求
JSPServlet根据index.jsp文件,将其翻译成为index_jsp.java 编译为index_jsp.class
JSP四大域对象
PageContext Request Session ServletContext(Application)
JSTL : JSP Standard Tag Library
EL:简化取值操作
注意区分:getParameter getAttribute
注意区分:request 和 requestScope
request{
requestScope
HttpSession getSession();
String getParameter();
}
param:获取请求参数
paramValues:获取请求参数的 对选框
header:请求头
headerValues:获取某个头的多个值
cookie:获取cookie
initParm:获取web.xml中配置的初始化参数
Cookie与Session
cookie:浏览器端保存少量数据的技术
1)保存少量
2)都是纯文本
3)每次访问均会被携带
使用
Cookie c = new Cookie("username","zhangsan");
或者 response.setHeader("Set-Cookie","username=zhangsan");
有效时间
默认:当浏览器关闭后则自动消失
自定义:通过setMaxAge设置
正数:多长时间实效
负数:默认
0:立即失效(用一个同名cookie来设置失效
Session:服务器端保存大量数据的一种技术,可在同一个会话期间共享,服务器为每一个客户创建的一个map集合
第一次使用时才创建
Session实现令牌机制
防止表单重复提交
Filter
url-pattern三种写法
/picture/haha.jsp 精确匹配
/picture/* 路径匹配
*.jsp 后缀匹配
注意filter的chain.dofilter的原理流程
Ajax与Json
JSON
JS对象表示法、是一种轻量级(和XML相比)的数据交换格式、
//将js对象转为json字符串
var str = JSON.stringify(student);
// alert(str);
//将json字符串转化为js对象
var obj = JSON.parse(str);
alert(obj.name);
/**
*
* JSON类之toJSONString()方法,实现json对象转化为json字符串和javabean对象转化为json字符串
* String str=JSON.toJSONString(student)
* JSON类之parseObject()方法,实现json字符串转换为json对象或javabean对象
* Student stu=JSON.parseObject(str,Student.class);
* JSON类之JSONArray()方法,实现json字符串转化为json对象数组或List<T>
* JSON类之toJSON()方法,实现javabean对象转化为json对象
* JSONObject jsonObject=(JSONObject)JSON.toJSON(student)
* JSON类之toJavaObject()方法,实现json对象转化为javabean对象
* Student student2=JSON.toJavaObject(jsonObject1, Student.class)
*/
Ajax
xhr(XmlHttpRequest)对象向服务器发起请求,并收到相应数据,利用dom(document object model)增删改的方式来改变页面效果
注意将服务器得到的json数据转为js对象、或者通过$post()的第四个参数指定type为"json"