J2EE 学习

一、什么是 J2EE 

 

二、 创建 webapp 项目

https://www.jianshu.com/p/455c7c11dfb2

https://blog.csdn.net/dream_an/article/details/49020211

idea 如何导出 war 包: https://blog.csdn.net/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.csdn.net/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>


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值