JavaWeb学习笔记

Maven:自动导入配置jar包。

Maven项目架构管理工具:核心思想:约定大于配置

Maven:环境优化

1.修改web.xml为最新的


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">


web-app>

2.将Maven的结构搭建完整–java-- resources

重写方法快捷键Ctrl+O;

ServletContext:

package com.jun.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username="tiantian";
        context.setAttribute("username",username);
        System.out.println("小满");
    }
}

package com.jun.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class GetServlet extends HelloServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}


<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
<servlet>
    <servlet-name>helloservlet-name>
    <servlet-class>com.jun.servlet.HelloServletservlet-class>
servlet>
    <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
    <servlet>
        <servlet-name>getcservlet-name>
        <servlet-class>com.jun.servlet.GetServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>getcservlet-name>
        <url-pattern>/getcurl-pattern>
    servlet-mapping>
web-app>

测试访问

获取初始化参数:

<context-param>
        <param-name>urlparam-name>
        <param-value>jdbc:mysql://localhost:3306/mybatisparam-value>
    context-param>
    <servlet>
        <servlet-name>gpservlet-name>
        <servlet-class>com.jun.servlet.ServletDemo03servlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>gpservlet-name>
        <url-pattern>/gpurl-pattern>
    servlet-mapping>
package com.jun.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url=context.getInitParameter("url");
        resp.getWriter().print(url);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

请求转发

HttpServletResponse

web服务器接收到客户端的Http请求,针对这个请求,分别会创建一个代表请求的HttpServletRequest对象和代表响应的一个HttpServletResponse

如果获取客户端请求过来的参数:找HttpServletRequest

如果要给客户端响应一些信息:找HttpServletResponse

生成验证码:

package com.jun.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //如何让浏览器三秒自动刷新一次
       resp.setHeader("refresh","3");
       //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D g = (Graphics2D)image.getGraphics();
        //设置图片背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //给图片写数据
        g.setColor(Color.blue);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        //把图片写给浏览器
        ImageIO.write(image,"jpg",resp.getOutputStream());



    }
//生成随机数
    private String makeNum() {
        Random random=new Random();
        String num=random.nextInt(999999)+"";
        StringBuffer sb=new StringBuffer();
        for (int i = 0; i < 6-num.length(); i++) {
            sb.append("0");
        }
        num=sb.toString()+num;
        return num;
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

乱码问题解决

URLEncoder.encode("天意""utf-8")//编码
URLDecoder.decode(cookie.getValue(),"utf-8")//解码

Cookies测试

package com.jun.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.util.Date;

public class CookieDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out= resp.getWriter();
        Cookie[] cookies = req.getCookies();//服务器从客户端获取Cookie
        if(cookies!=null){
         out.write("您上次访问的时间是:");
            for (int i = 0; i <cookies.length; i++) {
                Cookie cookie=cookies[i];
                if (cookie.getName().equals("lastlogintime")){
                    long last=Long.parseLong(cookie.getValue());
                    Date date=new Date(last);
                    out.write(date.toLocaleString());
                }
            }
        }
        Cookie cookie = new Cookie("lastlogintime",System.currentTimeMillis()+"");//服务器给客户端响应一个Cookie
        cookie.setMaxAge(24*60*60);//设置cookie有效期
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

session和cookie的区别

cookie是把用户的数据写给用户的浏览器,浏览器保存

session是把用户的数据写到用户独占session中,服务器保存

session对象由服务器创建

使用场景:

保存一个登录用户的个人信息

购物车信息

在整个网站中经常使用的数据,我们将它保存在session中

使用session

package com.jun.servlet;

import com.jun.servlet.com.jun.pojo.Person;
//import com.jun.servlet.com.jun.pojo.person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //给session中存东西
        session.setAttribute("name",new Person("jack",18));
        //获取Session的ID
        String sessionId = session.getId();
        //判断Session是不是新创建的
        if (session.isNew()){
            resp.getWriter().write("创建成功,ID:"+sessionId);
        }else{
            resp.getWriter().write("已创建"+sessionId);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

package com.jun.servlet.com.jun.pojo;

public class Person {
    private String name;
    private int age;
    public Person(){}
    public Person(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

package com.jun.servlet;

import com.jun.servlet.com.jun.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //给session中存东西
        Person name = (Person) session.getAttribute("name");
        System.out.println(name.toString());
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

package com.jun.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.invalidate();//手动关闭Session
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

什么是JSP

Java Server Pages:Java服务器端页面,也和Servlet一样,用于动态Web技术

最大特点:写JSP就像在写HTML

区别:

HTML只给用户提供静态的数据

JSP页面中可以嵌入Java代码,用于给用户提供动态数据

JSP脚本片段

<%int sum=0;
    for (int i = 0; i <=100 ; i++) {
      sum+=i;

    }
    out.println("<h1>Sum="+sum+"<h1>");
  %>

JSP脚本再实现

<%
    for (int i = 0; i <5 ; i++) {

    %>
  <h1>Hello,World! <%=i%>h1>
  <%}%>

JSP声明

%!static{
    System.out.println("Loading");
  }
  private int globalVar=0;
  public void kuang(){
    System.out.println("你好");
  }%>

JSP注释不会在客户端显示,html注释会在客户端显示。

修改xml文件需要重启web服务器。

9大内置对象

PageContext:存东西

Request:存东西

Response

Session:存东西

Application:【ServletContext】存东西

config:【ServletConfig】

out

page:几乎不用

exception

pageContext.setAttribute("name1","jack1");//保存的数据只在一个页面中有效
request.setAttribute("name2","jack2");//保存的数据只在一次请求中有效
session.setAttribute("name3","jack3");//保存的数据只在一次会话中有效
application.setAttribute("name4","jack4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器

EL表达式:${}

获取数据、执行运算、获取web开发的常用对象

JSP标签

<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="tiantian">jsp:param>
    <jsp:param name="age" value="18">jsp:param>

jsp:forward>

JSTL表达式

JSTL标签库的使用就是为了弥补html标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样。

<%--
  Created by IntelliJ IDEA.
  User: 星辰
  Date: 2023/7/27
  Time: 18:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


    Title


测试


<%--判断如果提交的用户名是管理员,则登录成功--%> <%--自闭和标签--%>

编写过滤器

package com.jun.filter;


import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("chushihua");//初始化web服务器启动,就可以初始化
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/html;charset=UTF-8");
        System.out.println("qian");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走
        System.out.println("hou");
    }

    public void destroy() {
        System.out.println("xiaohui");//web服务器关闭的时候,过滤就会销毁
    }
}

在xml文件中配置

<filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>com.jun.filter.CharacterEncodingFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>
        <url-pattern>/servlet/*url-pattern>
    filter-mapping>

实现监听器

package com.jun.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineCountListener implements HttpSessionListener {
    //一旦创建,就会触发一次这个事件
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        ServletContext ctx = httpSessionEvent.getSession().getServletContext();
        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
        if(onlineCount==null){
            onlineCount=new Integer(1);
        }else{
            int count=onlineCount.intValue();
            onlineCount=new Integer(count+1);
        }
        ctx.setAttribute("OnlineCount",onlineCount);
    }

    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {

    }
}

在xml中配置

<listener>
        <listener-class>com.jun.listener.OnlineCountListenerlistener-class>
    listener>

导入数据库依赖

<dependency>
      <groupId>com.mysqlgroupId>
      <artifactId>mysql-connector-jartifactId>
      <version>8.0.33version>
    dependency>

你可能感兴趣的:(学习,笔记)