学习笔记:javaEE基础2 Servlet,JSP

来源于从网页搭建入门Java Web

基础的servlet,jsp,以及正则知识


目录结构

对中文的支持

  • 对于字符串
1
new String(str.getBytes("ios-8859-1"), "utf-8")
  • 对于jsp文件
1
<%@page contentType="text/html;charset=utf-8"%>
  • servlet中
1
2
request.setCharacterEncoding("UTF-8")
response.setContentType("text/html;charset=utf-8")
  • 直接修改配置文件

在配置文件server.xml中中为Connector添加属性URIEncoding=”UTF-8”(Tomcat8+不用)


上传文件的操作

对于前端,需要对form标签的 type 值修改为 multipart/form-data,同时需要使用post方法

对于后端,需要使用第三方jar包 commons-fileuploadcommons-io 对request进行处理

首先,需要生成一个唯一的文件名,这里使用到类 UUID

1
2
3
4
5
private String getFileName(String filename) {
// 获取文件后缀的index
int idx = filename.lastIndexOf(".");
return UUID.randomUUID().toString().replace("-", "") + filename.substring(idx);
}

之后就可以进行操作了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filePath = "";
try {

// 1. 创建一个磁盘文件项工厂对象
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();

// 2. 创建一个核心解析类
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);

// 3. 解析request请求,返回的是list集合,存放的是FileItem对象
List<FileItem> fileItems = servletFileUpload.parseRequest(request);

// 4. 遍历
for (FileItem fileItem : fileItems) {
// 普通表单项
if (fileItem.isFormField()) {
String name = fileItem.getFieldName();
String value = fileItem.getString("UTF-8");
System.out.println(name + " " + value);
}
// 文件上传项
else {
// 获取文件名称及唯一名称
String filename = fileItem.getName();
String uuidname = this.getFileName(filename);

// 获取文件上传数据
InputStream inputStream = fileItem.getInputStream();

// 上传,写到磁盘上
File file = new File(this.getServletContext().getRealPath("/upload") ,uuidname);
System.out.println(file.getAbsolutePath());
file.createNewFile();
OutputStream os = new FileOutputStream(file);
int len = 0;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
os.write(b, 0, len);
}
filePath = file.getAbsolutePath();
inputStream.close();
os.close();
}
}

} catch (Exception e) {
e.printStackTrace();
} finally {
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(filePath);
}
}

http相关

  • 请求转发 一次请求
  • 请求重定向 两次请求
  • restful风格获取url最后一项 /api/user/1
1
2
String url = request.getRequestURL().toStirng();
String id= url.substring(url.lastIndexOf("/") + 1)

三大作用域对象

  • HttpServletRequest 请求对象
  • HttpSession 用户回话对象
  • ServletContext对象 全局的,只有一个

九大内置对象

  • exception内置对象使用时,需要在页面的page指令下增加isErrorPage属性
  • pageContextPageContext类的实例,代表当前页面的上下文对象,它封装了相应的方法来访问pagerequestsessionapplication范围的变量;可以获得其他的内置对象

web.xml一些配置

  • web.xml设置全局参数
1
2
3
4
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>

使用 context.getInitParameter("");获取

  • 配置默认页面
1
2
3
4
<error-page>
<error-code></error-code>
<error-location></error-location>
</error-page>
  • servlet tomcat已启动就执行
1
<load-on-startup></load-on-startup>

EL表达式

  • 获取setAttribute中的值
  • ${}用于替换out.print() 语句
    • ${student.name}
  • 简化parameter输出
    • ${param. …}
  • pageScope
  • requestScope
  • sessionScope
  • applicationScope
    • 不写作用于对象,则从上到下依次获取
  • 本质上是调用toString方法

JSTL

核心标签库

页头引入

1
<%@ taglib prefix="c" uri=".." %>
  • tld文件`定义了标签具体的使用形式

  • 输出

1
2
<c:out value="" default=""></c:out>
escapeXml 是否要转义
  • 条件
1
2
3
4
5
6
<c:if test="${...}"></c:if>
<c:choose>
<c:when test="${...}"> ... </c:when>
...
<c:otherwise> ... </c:otherwise>
</c:choose>
  • 循环
1
2
3
4
<c:forEach var="p" items="${collection}" varStatus="idx">
${idx.index}
${p.name}
</c:forEach>

fmt格式化输出 数字,日期

  • yyyy 年
  • MM 月
  • dd 日
  • HH 24h
  • hh 12h
  • mm 分钟
  • ss 秒
  • SSS 毫秒
1
<fmt:formatDate value="..." pattern="..."/>

0.000 后三位

1
<fmt:formatNumber value="..." pattern="..."/>

身份记录

  • session
    • 登陆成功后存在建议将登陆信息session中
    • session 窗口当前回话 浏览器端,时效性为30min
    • cookie中保存SessionId

web.xml中设置session的失效时间

1
2
3
4
<!-- 设置session时间,0或负数表示永不失效,这里表示1min -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
  • cookie
    • Cookie默认关闭浏览器就没有了 客户端
1
2
3
4
new Cookie(..., ...)
cookie.setPath("/..)
cookie.setMaxAge(....)
response.addCookie(cookie)

正则表达式

没啥说的,就把几个关键词记得就行了