JSP/Servlet

B/S:浏览和服务器

C/S 客服端和服务器

Web服务器

lls

Tomcat

可以改动其最后的运行吗?

需要在Diver里面更改系统变量

 

 

 

 ​​​

 

 

   Servlet

 sun公司开发动态web的一门技术

Sun'在API提供一个接口叫做Servlet

        编写一个类实现Servlet

        开发好的Java类部署到Web服务器中

把实现了Servlet的接口JAVA程序,叫做Servlet

 

 

package com.qi.servlet;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {

    //由于get与post只是请求实现的不同方式,可以互相调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


       // ServletInputStream inputStream = req.getInputStream();输入流
        //ServletOutputStream outputStream = resp.getOutputStream();输出流

        PrintWriter writer = resp.getWriter();//响应流

        writer.print("你好啊");

    }

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

 

   <!--注册Servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.qi.servlet.HelloServlet</servlet-class>
    </servlet>
    <!--Servlet路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    

 

原因:Tomcat10之后包名不再是"javax.servlet”,则是改为"jakarta.servlet"
解决办法:

第一种解决办法:Tomcat版本改为10以下的版本

第二种解决办法:“javax.servlet”改为"jakarta.servlet”

<dependency>
  <groupId>jakarta.servlet.jsp</groupId>
  <artifactId>jakarta.servlet.jsp-api</artifactId>
  <version>3.0.0</version>
</dependency>
<dependency>
  <groupId>jakarta.servlet</groupId>
  <artifactId>jakarta.servlet-api</artifactId>
  <version>5.0.0</version>
</dependency>

<!--类中的导入部分也需要更改
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
-->
————————————————
版权声明:本文为CSDN博主「尘.埃」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_44881823/article/details/119848149

 

 

 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

 

 

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

public class ErrorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

        PrintWriter writer = resp.getWriter();
        writer.print("<h1>404</h1>");

    }

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

    <!--注册404Servler-->
    <servlet>
        <servlet-name>404</servlet-name>
        <servlet-class>com.qi.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>404</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

getServletContext

共享数据

放置的类

package com.qi.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


       // this.getInitParameter();//初始化参数
        //this.getServletConfig();//Servlet配置
        //this.getServletContext();//Servlet联系上下文
        ServletContext context = this.getServletContext();

        String s = "傻狗";//数据
        context.setAttribute("username",s);//将一个数据保存在ServletContext中,名字为username 值为s

        System.out.println("hello world");
    }

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

读取的类

package com.qi.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");


        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        resp.getWriter().print("他名字是"+username);
    }

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

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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>hello</servlet-name>
        <servlet-class>com.qi.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getcontext</servlet-name>
        <servlet-class>com.qi.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getcontext</servlet-name>
        <url-pattern>/name</url-pattern>
    </servlet-mapping>

</web-app>

获取初始化参数

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<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应用初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybits</param-value>
    </context-param>
    
    
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.qi.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getcontext</servlet-name>
        <servlet-class>com.qi.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getcontext</servlet-name>
        <url-pattern>/name</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>gp</servlet-name>
        <servlet-class>com.qi.servlet.ServletDemo3</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>gp</servlet-name>
        <url-pattern>/gp</url-pattern>
    </servlet-mapping>


</web-app>

读取文件

package com.qi.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ServletDemo3 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 {
        doGet(req, resp);
    }
}

请求转发

package com.qi.servlet;

import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext context = this.getServletContext();

        System.out.println("进入了Sd4");
        //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
        //requestDispatcher.forward(req,resp);//调用forward实现请求转发
        context.getRequestDispatcher("/gp").forward(req,resp);
    }

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

 读取资源文件

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");

        resp.getWriter().print(user);
        resp.getWriter().print(pwd);


    }

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

 

 HttpServletResponse

 简单分类

        

         

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.FileInputStream;
import java.io.IOException;


public class FileServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //获取下载文件路径
           // String realPath = this.getServletContext().getRealPath("/1.jpg");
            String realPath = "C:\\Users\\V556U\\Desktop\\springboot\\com.du.study.servlet\\response\\target\\classes\\1.jpg";
            System.out.println("文件路径"+realPath);
            // 下载文件名是啥
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
            // 设置想办法让浏览器能够支持我们需要的东西
            resp.setHeader("Content-Disposition","attchment;filename="+fileName);
            // 获取下载文件的输入流
            FileInputStream in = new FileInputStream(realPath);
            // 创建缓冲区
            int len = 0;
            byte[] buffer = new byte[1024];
            // 获取OutputStram对象
            ServletOutputStream out = resp.getOutputStream();
            // 将FileOutputStream流写入到buffer缓冲区
            while ((len=in.read(buffer))>0){
                out.write(buffer,0,len);
            }
            // 使用OutputStream将缓冲区中的数据输出到客户端


            in.close();
            out.close();

        }

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


验证码功能

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.imageio.ImageIO;
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 {


        //如何让浏览器5秒响应一次
        resp.setHeader("refresh","3");

        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D graphics = (Graphics2D) image.getGraphics();//笔
        //设置图片背景颜色
        graphics.setColor(Color.white);
        graphics.fillRect(0,0,80,20);

        //给图片写数据
        graphics.setColor(Color.blue);
        graphics.setFont(new Font(null,Font.BOLD,20));
        graphics.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(9999999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i =0;i< 7 - 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);
    }
}

实现重定向

resp.sendRedirect("/img");
/*
        * 等价于
        * resp.setHeader("Location","/r/img");
        * resp.setStatus(302);
        *
        */

 

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("进入这个请求");
        //请求处理
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        System.out.println(username);
        System.out.println(password);

        //注意路径问题
        resp.sendRedirect("/response_war/success.jsp");

    }

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

HttpServletRequest

 得到 前端参数

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.Arrays;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println("=============================");
        //
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("=============================");

        //通过请求转发
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
        resp.setCharacterEncoding("utf-8");
    }

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

 Cookie与Session

        会话

 

 

 

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;

//中文数据传输
public class CookieDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //解决中文乱码
        resp.setHeader("Content-type", "text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        PrintWriter out = resp.getWriter();

        //Cookie服务器从客服端获取的
        Cookie[] cookies = req.getCookies();//cookie可能返回多个获得cookie

        //判断Cookie是否存在
        if (cookies!=null){
            //如果存在
            out.write("你上次访问的时间:");

            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取Cookie的名字key
                if (cookie.getName().equals("name")){
                    //获得cookie中的值

                    out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
                    System.out.println(cookie.getValue());
                }

            }

        }else {
            out.write("这是第一次访问本站");
        }


        Cookie cookie = new Cookie("name", URLEncoder.encode("杜淇","utf-8"));
        resp.addCookie(cookie);
    }

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

显示不出来,需要编码解码,注意字符串

Session

 

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.*;

import java.io.IOException;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //解决乱码问题
        resp.setHeader("Content-type", "text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //得到Session
        HttpSession session = req.getSession();

        //给Session中存东西
        session.setAttribute("name","杜淇");

        //获取Session的ID
        String id = session.getId();

        //判断Session是不是新创建
        if (session.isNew()){
            resp.getWriter().write("Session创建,Id="+id);
        }else {
            resp.getWriter().write("Session已经创建,id为"+id);
        }

        //Session在创建是做了些什么
//        Cookie cookie = new Cookie("JSESSIONID", id);
//        resp.addCookie(cookie);

    }

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

 也可以传输对象

package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setHeader("Content-type", "text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //得到Session
        HttpSession session = req.getSession();

        String name = (String) session.getAttribute("name");

        System.out.println(name);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
package com.qi.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.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();
    }

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

 默认注销

<?xml version="1.0" encoding="UTF-8"?>
<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>CookieDemo01</servlet-name>
        <servlet-class>com.qi.servlet.CookieDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo01</servlet-name>
        <url-pattern>/c1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>CookieDemo02</servlet-name>
        <servlet-class>com.qi.servlet.CookieDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo02</servlet-name>
        <url-pattern>/c2</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>CookieDemo03</servlet-name>
        <servlet-class>com.qi.servlet.CookieDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieDemo03</servlet-name>
        <url-pattern>/c3</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SessionDemo01</servlet-name>
        <servlet-class>com.qi.servlet.SessionDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo01</servlet-name>
        <url-pattern>/s1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SessionDemo02</servlet-name>
        <servlet-class>com.qi.servlet.SessionDemo02</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo02</servlet-name>
        <url-pattern>/s2</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SessionDemo03</servlet-name>
        <servlet-class>com.qi.servlet.SessionDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionDemo03</servlet-name>
        <url-pattern>/s3</url-pattern>
    </servlet-mapping>


<!--    设置Session的默认失效时间-->
    <session-config>
<!--  15分钟后自动失效,以分钟为单位      -->
        <session-timeout>15</session-timeout>
    </session-config>

</web-app>

 JSP

 

 

 1、判断请求

2、内置一些对象

3、输出页面前增加的代码

4、以上的这些对象我们可以在JSP页面直接使用

 在JSP页面中java代码直接输出,Html就会转化为out.wtite()输出

JSP基础语法

 JSP表达式

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>


<%--JSP表达式
    作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>




</body>
</html>

脚本片段

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>


<%--JSP表达式
    作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<hr>
<%--脚本片段--%>
<%
int sum = 0;
    for (int i = 1; i <=100; i++) {
        sum+=1;
    }
    System.out.println("<h1>sum="+sum+"</h1>");

%>


</body>
</html>

脚本 片段的再实现

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>


<%--JSP表达式
    作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<hr>
<%--脚本片段--%>
<%
    int sum = 0;
    for (int i = 1; i <=100; i++) {
        sum+=i;
    }
    out.println("<h1>sum="+sum+"</h1>");

%>
<%
int x =10;
out.println(x);
%>
<p>这是一个Jsp文档</p>
<%
int y = 2;
out.println(y);

%>
<hr>

<%--在代码中嵌入Html元素--%>
<%
    for (int i = 0; i < 5; i++) {
        %>
<h1>helloword <%=i%></h1>
<%
    }

%>

</body>
</html>

JSP声明

<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<body>
<h2>Hello World!</h2>


<%--JSP表达式
    作用:用来将程序输出,输出到客户端
<%= 变量或者表达式%>
--%>
<%= new java.util.Date()%>
<hr>
<%--脚本片段--%>
<%
    int sum = 0;
    for (int i = 1; i <=100; i++) {
        sum+=i;
    }
    out.println("<h1>sum="+sum+"</h1>");

%>
<%
int x =10;
out.println(x);
%>
<p>这是一个Jsp文档</p>
<%
int y = 2;
out.println(y);

%>
<hr>

<%--在代码中嵌入Html元素--%>
<%
    for (int i = 0; i < 5; i++) {
        %>
<h1>helloword <%=i%></h1>
<%
    }
%>
<hr>
<%!
    static {
        System.out.println("Loading Servlet!");
    }

    private int globalVar = 0;

    public void qi(){
        System.out.println("进入qi");
    }

%>

</body>
</html>

 

 

 

 

<%--
  Created by IntelliJ IDEA.
  User: V556U
  Date: 2021/9/16
  Time: 21:31
  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>

<%--内置对象--%>

<%
    pageContext.setAttribute("name1","啊1");//保存数据只在一个页面中有效
    request.setAttribute("name2","啊2");//保存数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","啊3");// 保存的数据只在一次会话中有效,从打开浏览器到关闭
    application.setAttribute("name4","啊4");//保存的数据在服务器中有效
%>
<%--脚本片段中的代码,会原封不懂的生成jsp中,需要保证java语法的正确性--%>
<%
    //从pageContext中取出,通过寻找的方式来取
    //从底层到高层(作用域):page->request->session->application
    //JVM:双亲委派机制
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5");
%>
<%--使用EL表达式输出${}}--%>
<h1>取出值为</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<%--<h3>${name5}</h3>--%>
<h3><%=name5%></h3>



</body>
</html>

request:客户端向服务器发送请求,产生数据,用户看完就没用了,比如新闻,用户看完没用的

session:客户端向服务器发送请求,产生数据,用户看完一会还有用,比如购物车;

application:客户端向服务器发送请求,产生数据,一个用户用完了,其他用户还可能使用,比如聊天数据

JSP标签,JSTL标签,EL标签

导包

<!--  jstl表达式依赖  -->
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2-rev-1</version>
    </dependency>
<!--  standard依赖  -->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
  </dependencies>

EL表达式         ${ }

 JSP标签

<h1>这里是tag1</h1>
<%--<jsp:include page="error/500.jsp"></jsp:include>--%>

<jsp:forward page="jsptag2.jsp">
    <jsp:param name="value1" value="value1"/>
    <jsp:param name="value2" value="value2"/>
</jsp:forward>

JSTL标签

 

 

 

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

if

 c:choose

 

 c:foreach

 

 JAVABean

 

idnameageaddress
1a11系统
2b12相同
3c14仙桃

class person{
    private int id;
    private String name;
    private int age;
    private String address;
}

class A{
    new person(1,"d",14,"下图");
}
<%@ page import="com.qi.entity.People" %><%--
  Created by IntelliJ IDEA.
  User: V556U
  Date: 2021/9/17
  Time: 14:09
  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>

<%
//  People people = new People();
//  people.setAddresss("仙桃");
//  people.setAge(11);
//  people.setId(1);
//  people.setName("a");
//
//  people.getAddresss();
//  people.getAge();
//  people.getId();
//  people.getName();
%>
<jsp:useBean id="people" class="com.qi.entity.People" scope="page"/>
<jsp:setProperty name="people" property="addresss" value="仙桃"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="11"/>
<jsp:setProperty name="people" property="name" value="a"/>

姓名=<jsp:getProperty name="people" property="name"/>
年龄=<jsp:getProperty name="people" property="age"/>
地址=<jsp:getProperty name="people" property="addresss"/>
id=<jsp:getProperty name="people" property="id"/>

</body>
</html>

MVC三层架构

 

三层架构

 

 Filter

 

 

package com.qi.filter;


import jakarta.servlet.*;

import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("C初始化");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //1.过滤所有代码,在过滤特定的请求的时候都会执行
        //2.必须让过滤器继续执行


        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");


        System.out.println("C执行前");
        chain.doFilter(request, response);//让我们请求继续走,不然就被拦截
        System.out.println("C执行后");
    }

    //web服务器停止
    public void destroy() {
        System.out.println("C'销毁");
    }
}

3.在WEBXML配置

<?xml version="1.0" encoding="UTF-8"?>
<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>ServletShow</servlet-name>
    <servlet-class>com.qi.servlet.ServletShow</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletShow</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletShow</servlet-name>
    <url-pattern>/show</url-pattern>
  </servlet-mapping>
  
  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.qi.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
<!--    只要是/servlet的任何请求都会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>

</web-app>
        

监听器

package com.qi.listener;

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

//统计网站在线人数,统计session
public class OnlineCountListener implements HttpSessionListener {
    //创建Session监听
    //创建一次执行一次
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext ctx = se.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);
    }
    //销毁Session监听
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();
        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if(onlineCount==null){
            onlineCount = new Integer(0);
        }else {
            int count = onlineCount.intValue();

            onlineCount = new Integer(count-1);
        }

        ctx.setAttribute("OnlineCount",onlineCount);
    }
}

<?xml version="1.0" encoding="UTF-8"?>
<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>ServletShow</servlet-name>
    <servlet-class>com.qi.servlet.ServletShow</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ServletShow</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>ServletShow</servlet-name>
    <url-pattern>/show</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.qi.filter.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
<!--    只要是/servlet的任何请求都会经过这个过滤器-->
    <url-pattern>/servlet/*</url-pattern>
  </filter-mapping>
  
  <listener>
    <listener-class>com.qi.listener.OnlineCountListener</listener-class>
  </listener>

  <session-config>
    <session-timeout>1</session-timeout>
  </session-config>
</web-app>

过滤器与监听器常见使用

package com.qi.filter;

import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

        //ServletRequest  HttpServletRequst
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        Object user_session = request.getSession().getAttribute("USER_SESSION");
        if (user_session==null){
            response.sendRedirect("/error.jsp");
        }

        chain.doFilter(req,resp);
    }

    public void destroy() {

    }
}

JDBC

 

 SQL创建表格

CREATE TABLE users(
	id INT PRIMARY KEY,
	`name` VARCHAR(40),
	`password` VARCHAR(40),
	email VARCHAR(60),
	birthday DATE
);

INSERT INTO users(id,`name`,`password`,email,birthday)
VALUE(2,'张三','123456','akahdk@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUE(4,'李四','123456','akahdk@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUE(5,'王五','123456','akahdk@qq.com','2000-01-01');

导入数据依赖包

   <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>

IDEA中链接数据库

 

 JDBC固定步骤

package com.qi.test;

import com.mysql.jdbc.Driver;

import java.sql.*;

public class TestJdbc {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //配置信息
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gbk";
        String username = "root";
        String password = "root";

        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.链接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.向数据库发送SQL的对象Statement:CURD 和 PreparedStatement
        Statement statement = connection.createStatement();
        //4.编写SQL
        String sql = "select * from users";
        //5.执行SQL,返回一个结果集
        ResultSet resultSet = statement.executeQuery(sql);

        while (resultSet.next()){
            System.out.println("id"+resultSet.getObject("id"));
            System.out.println("name"+resultSet.getObject("name"));
            System.out.println("password"+resultSet.getObject("password"));
            System.out.println("email"+resultSet.getObject("email"));
            System.out.println("birthday"+resultSet.getObject("birthday"));
        }
        //6.关闭链接释放资源 先开后关
        resultSet.close();
        statement.close();
        connection.close();

    }
}

预编译SQL

package com.qi.test;

import java.sql.*;

public class TestJdbc2 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //配置信息
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gbk";
        String username = "root";
        String password = "root";

        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.链接数据库,代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.编写SQL
        //String sql = "select * from users";
        String sql = "insert into users(id,name,password,email,birthday) values(?,?,?,?,?);";
        //4.预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setInt(1,9);//给第一个占位符?的值赋值为1;
        preparedStatement.setString(2,"爱迪生");//给第二个占位符?的值赋值为爱迪生;
        preparedStatement.setString(3,"123456");//给第三个占位符?的值赋值为123456;
        preparedStatement.setString(4,"ad@qq.com");//给第四个占位符?的值赋值为ad@qq.com;
        preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符?的值赋值为1;

        //5.执行SQL
        int i = preparedStatement.executeUpdate();

        if (i>0){
            System.out.println("执行成功");
        }

        //6.关闭链接释放支援,先开后放
        preparedStatement.close();
        connection.close();
    }
}

事务

 

 

 

 事务代码

package com.qi.test;

import org.junit.jupiter.api.Test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class TestJdbc3 {
    @Test
    public void test()  {
        //配置信息
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=gbk";
        String username = "root";
        String password = "root";
        Connection connection = null;
        //1.加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");

            //2.链接数据库,代表数据库
            connection = DriverManager.getConnection(url, username, password);

            //3.通知数据库,开启事务,faler是开启,true是关闭
            connection.setAutoCommit(false);

            String sql = "update account set money = money-100 where name = 'A';";
            connection.prepareStatement(sql).executeUpdate();

            //制造错误
            //int i=1/0;

            String sql1 = "update account set money = money+100 where name = 'B';";
            connection.prepareStatement(sql).executeUpdate();

            connection.commit();//以上两条sql都成功,就提交
            System.out.println("success");
         } catch (ClassNotFoundException | SQLException e) {
            try {
                //如果出现异常,就回滚
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }


    }
}

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐