一、什么是 J2EE
二、 创建 webapp 项目
https://www.jianshu.com/p/455c7c11dfb2
https://blog.youkuaiyun.com/dream_an/article/details/49020211
idea 如何导出 war 包: https://blog.youkuaiyun.com/u011291072/article/details/53232115
三、 使用
3.1 目录解析
class: 存放应用相关的 class 文件
lib: 存放应用相关的
四、Servlet
Servlet 是一门用于开发动态web资源的基数,同时也是JSP的基础
Servlet 是平台独立的Java类,即 Servlet 是一个按 Servlet 规范编写的 Java 类
4.1 使用
package net.tom.mcl.servlet;
import javax.servlet.*;
import java.io.IOException;
public class LoginServlet implements Servlet{
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("LoginServlet 处理请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
4.2 页面重定向
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
// 通过设置状态码,以及重定向的页面
resp.setStatus(302);
resp.setHeader("location", "login_success.html");
}
4.3 处理页面请求乱码的问题
4.4 文件下载
package net.tom.mcl.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
public class DownServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String fileName = req.getParameter("fileName");
// fileName = new String(fileName.getBytes("iso-8859-1"), "utf-8");
// fileName = getStr(req, fileName);
resp.setHeader("Content-Disposition", "attachment;fileName="+getStr(req,fileName));
// resp.setHeader("Content-Disposition", "attachment;fileName="+fileName);
String path = getServletContext().getRealPath("/upload");
System.out.println("path = " + path + File.separator + fileName);
InputStream inputStream = new FileInputStream(path + File.separator + fileName);
OutputStream outputStream = resp.getOutputStream();
int length = 0;
// 桶
byte[] bs = new byte[1024];
while ((length = inputStream.read(bs)) != -1) {
outputStream.write(bs, 0, length);
}
// 关闭资源
outputStream.close();
inputStream.close();
}
// 根据不同的浏览器修改文件名称
private String getStr(HttpServletRequest request, String fileName) {
String userAgent = request.getHeader("User-Agent");
System.out.println("userAgent = " + userAgent);
String newFileName = "";
try {
if(userAgent != null && userAgent.indexOf("MSIE") > -1) {
System.out.println("-------- ie浏览器 --------");
newFileName = URLEncoder.encode(fileName, "utf-8");
} else {
System.out.println("-------- 其他浏览器 --------");
newFileName = new String(fileName.getBytes("utf-8"), "iso-8859-1"); }
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("================= newFileName = " + newFileName);
return newFileName;
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<a href="down?fileName=it啊.jpg">下载图片</a><br/>
<a href="down?fileName=it啊啊.txt">下载文本</a>
</body>
</html>
4.5 ServletContext使用
4.6 获取项目地址和配置
String path = getServletContext().getContextPath()
ServletConfig:通过此对象可以读取web.xml
中配置的初始化参数,不写硬编码,将配置写在配置文件中。
ServletContext:这个对象是在Tomcat启动的时候就会创建,代表着当前整个应用。我们一般用来获取整个应用的配置信息(ServletConfig是单个的,而ServletContext是整个应用的),还可以用这个对象来读取资源文件。
小细节:
- Servlet是单例的
- 配置通配符的时候可以用各种的通配符
*.
和一个Servlet可以被多个配置映射 - 访问任何资源其实都是在访问Servlet(即便是访问图片资源,Tomcat都有默认Servlet处理)
五、cookie 和 session
5.1 cookie
5.1.1 用途
cookie 常用于 自动登录、浏览记录甚至购物车等
5.1.2 为什么要有cookie
由于浏览器访问是无状态的,浏览器要记录当前这个用户是否访问过,多个请求之间无法共享信息。
5.1.3 cookie的组成
cookie由:a) 名称 b) 值 c)一些操作属性:路径或所在域,版本号等
每个站点,一般最多接收20条cookie, 共300条,且每条 cookie 限制为 4k
5.1.4 使用
// 记录上次登陆时间
package xyz.tom.www.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do Service!");
String name = req.getParameter("lName");
System.out.println(name);
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
if (name.equals("admin")) {
Cookie[] cookies = req.getCookies();
Cookie cook = getCookieByName(cookies, "last");
if (cook == null) {
// 表示目前浏览器中没有这个cookie
Cookie cookie = new Cookie("last", System.currentTimeMillis() + "");
Cookie cookieCH = new Cookie("name2", "啊啊姓名");
cookieCH.setMaxAge(7*24*60*60);
resp.addCookie(cookieCH);
// 默认为-1,关闭浏览器则消失
// 以秒计算
cookie.setMaxAge(7*24*60*60);
// 设置只有发送该项目下的请求,才会返回cookie
// 若有多个应用在同一个tomcat/wabapp下要共享,则用 cookie.setPath('/');
System.out.println("path = " + getServletContext().getContextPath());
cookie.setPath(getServletContext().getContextPath());
// 添加到响应头
resp.addCookie(cookie);
PrintWriter printWriter = resp.getWriter();
printWriter.print("欢迎登陆:" + name);
} else {
Cookie coch = getCookieByName(cookies, "name2");
System.out.println("-=====================");
long lastTime = Long.parseLong(cook.getValue());
cook.setValue(System.currentTimeMillis() + "");
// 添加到响应头
resp.addCookie(cook);
String name22 = coch.getValue().toString();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 不是第一次登陆
PrintWriter printWriter = resp.getWriter();
printWriter.print("欢迎登陆:" + name + " 上一次登陆时间为:" + dateFormat.format(lastTime)
+ " name2 = " + name22 );
}
}
}
private Cookie getCookieByName(Cookie[] cookies, String name) {
if (cookies != null) {
for (Cookie cookie: cookies) {
if (cookie.getName().equals(name)) {
return cookie;
}
}
}
return null;
}
}
5.2 Session
5.2.1 Session
服务器可以为每个浏览器对象创建一个 session 对象,当需要保存用户数据时,可以将数据写入到用户浏览器独占的 session 中,当用户使用浏览器发送当前项目的请求时,处理请求的 servlet 可以从用户的 session 中去出已存入的数据
5.2.2 Session 和 cookie 的区别
https://blog.youkuaiyun.com/killerover84/article/details/25236311
5.2.3 Session 生命周期
1)创建:
request.getSession()
// 若没有 httpSession 对象,则会自动创建一个
request.getSession(true)
// 若填入 false,则没有 httpSession 对象时,会返回一个null
request.getSession(false)
创建 session 对象时,Tomcat 会为他分配一个唯一标识符即 sessionID
Tomcat会将 sessionID 保存在 Cookie中(MaxAge=-1),并响应给服务器
用户每次发起http请求时,会传递保存 sessionID 的 cookie
Tomcat 会从 HttpServletRequest 对象中国取出 sessionID
然后根据这个 SessionID 找到相应的 HttpSession 对象,从而获取用户的状态信息
2)销毁
2.1)销毁过程
session 是存放在服务器的内存中的,即使关闭了浏览器,session也不会被销毁。
关闭浏览器只是在客户端的内存中清除了与原会话相关的cookie
重新打开浏览器窗口时,之前存储session的cookie已经不存在了。
此时请求到服务器时,会创建一个新的session
原有的session到期后,会自动销毁
2.2)销毁情况:关闭服务器,或是 session回话过期(默认最大存活时间1800秒)
2.3)修改超时时间长度
<session-config>
<session-timeout>1</session-timeout>
</session-config>
或是:
req.getSession().setMaxInactiveInterval(60); -1 永不过期
5.2.4 使用
// 创建
request.getSession()
// 若没有 httpSession 对象,则会自动创建一个
request.getSession(true)
// 若填入 false,则没有 httpSession 对象时,会返回一个null
request.getSession(false)
5.2.5 当禁用cookie时,如何使用session
六、 监听器
6.1 什么是监听器,创建和销毁
常见的监听器: ServletContext httpSession ServletRequest
6.1.1 ServletContext
作用:在应用启动的时候,进行初始化。销毁时,释放一些资源
生命周期: 启动服务器时创建,关闭服务器时销毁
代码:
// web.xml
<!-- 配置监听器 -->
<listener>
<listener-class>main.xyz.tom.utils.ServletContextListenerTest</listener-class>
</listener>
// ServletContextTest.java
public class ServletContextListenerTest implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("监听器 创建");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("监听器 销毁");
}
}
6.1.2 HttpSession
作用:监听
生命周期:在创建session时创建,不会重复创建。(html中不会创建session,jsp和servlet会创建)
在session失效时销毁默认30分钟。或主动销毁(session.invalidate())
浏览器正常关闭不会销毁
使用:
// web.xml
<!-- 配置监听器 -->
<listener>
<listener-class>main.xyz.tom.utils.ServletContextListenerTest</listener-class>
</listener>
// HTTPSessionListenerTest.java
public class HTTPSessionListenerTest implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("HttpSession 创建");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("HttpSession 销毁");
}
}
6.2 钝化和活化
七、 Servlet 2.5 和 Servlet 3.0 的区别
八、JSP
8.1 什么是jsp
由于 Servlet 构建动态网页比较麻烦,故开发时需要使用 Servlet 开发动态网页
JSP 的最大特点在于可以在 html 中嵌入 java 代码,为用户提供动态数据。
8.2 全局变量和局部变量
<%! ...... %> 是全局变量
<% ..... %> 是局部变量
<%= ... %> 在js中使用java变量
<%--
Created by IntelliJ IDEA.
User: mi
Date: 2020/3/18
Time: 22:12
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%!
String name = "刘德华";
public String getName() {
return name;
}
class innerClazz {
String name = "张学友";
public String getName() {
return name;
}
}
%>
<%
for(int i=1; i<=9; i++) {
%>
<br/>
<%
for(int j=1; j<=i; j++) {
%>
<%=j %>x<%=i %>=<%=j*i %>
<% }
}
%>
<%--
name: <%=name%><br/>
getName: <%=getName()%><br/>
innerClazz: <%=new innerClazz().getName()%>
--%>
</body>
</html>