Browse Source

1124 servlet小项目

Demi 6 months ago
parent
commit
bd6fd6655c

+ 12 - 0
tomcat-demo/pom.xml

@@ -27,6 +27,18 @@
             <scope>provided</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.34</version>
+        </dependency>
+        <!--  是阿里推出的基于jdbc封装的连接池   -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.2.23</version>
+        </dependency>
+
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>

+ 68 - 0
tomcat-demo/src/main/java/com/sf/sysdemo/dao/BaseDao.java

@@ -0,0 +1,68 @@
+package com.sf.sysdemo.dao;
+
+import com.sf.sysdemo.entity.SysUser;
+import com.sf.sysdemo.util.JDBCUtil;
+
+import java.lang.reflect.Field;
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+// 提供一个基础的dao类
+//   封装对数据库的模板代码
+public class BaseDao {
+
+    public static void main(String[] args) {
+        BaseDao dao = new BaseDao();
+        List<Object> list = dao.baseQuery(SysUser.class, "select * from sys_user");
+        System.out.println(list);
+    }
+
+    // 泛型方法 不确定返回类型  如果一行数据对应的类型是 T  那么这里支持返回多行数据
+    // Object ... args 是可变参数  实际上是一个数组
+    public <T> List<T> baseQuery(Class clazz, String sql, Object... args){
+        List<T> list = new ArrayList<T>();
+
+        Connection connection = JDBCUtil.getConnection();
+        PreparedStatement preparedStatement = null;
+        ResultSet resultSet = null;
+
+        try {
+            preparedStatement = connection.prepareStatement(sql);
+            // 让sql语句支持参数
+            for (int i = 0; i < args.length; i++) {
+                Object arg = args[i];
+                preparedStatement.setObject(i + 1, arg);
+            }
+
+            // 执行查询
+            resultSet = preparedStatement.executeQuery();
+            // 获取返回结果的元数据
+            ResultSetMetaData metaData = resultSet.getMetaData();
+            // 返回的实际是一个表格 这里获取表格有多少列
+            int columnCount = metaData.getColumnCount();
+
+            while (resultSet.next()) {
+                // 这里从确定的 通过sys_user查询的结果 可以映射为一个SysUser类的对象
+                // 变成不确定的 通过一个Class类型 映射为一个动态类型的对象
+                Object cls = clazz.getDeclaredConstructor().newInstance();
+                for (int i = 1; i <= columnCount; i++) {
+                    // 获取列名
+                    String columnName = metaData.getColumnLabel(i);
+                    // 获取这一列对应的值
+                    Object value = resultSet.getObject(columnName);
+                    // 找到列名对应的字段
+                    Field field = clazz.getDeclaredField(columnName);
+                    // 设置属性是可被访问的
+                    field.setAccessible(true);
+                    field.set(cls, value);
+                }
+                list.add((T)cls);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        // 一堆关闭
+        return list;
+    }
+}

+ 19 - 0
tomcat-demo/src/main/java/com/sf/sysdemo/entity/SysSchedule.java

@@ -0,0 +1,19 @@
+package com.sf.sysdemo.entity;
+
+import lombok.*;
+
+import java.io.Serializable;
+
+// 需要 无参构造器 全参构造器 get和set方法 toString方法
+// 可以生成模板代码
+// 也可以使用注解代替
+@Data
+@AllArgsConstructor  // 代表全参构造器
+@NoArgsConstructor // 代表无参构造器
+public class SysSchedule implements Serializable {
+
+    private Integer sid;
+    private Integer uid;
+    private String title;
+    private Integer completed;
+}

+ 56 - 0
tomcat-demo/src/main/java/com/sf/sysdemo/entity/SysUser.java

@@ -0,0 +1,56 @@
+package com.sf.sysdemo.entity;
+
+import java.io.Serializable;
+
+// 标准的实体类
+//   实体类需要是可序列化的  因为数据和对象的映射 是一个输入输出的处理过程
+//   还应该有全参构造器 和 无参构造器
+public class SysUser implements Serializable {
+
+    // 这里尽量不用基本数据类型 而是使用包装类
+    private Integer uid;
+    private String username;
+    private String password;
+
+    public SysUser() {
+    }
+
+    public SysUser(Integer uid, String username, String password) {
+        this.uid = uid;
+        this.username = username;
+        this.password = password;
+    }
+
+    public Integer getUid() {
+        return uid;
+    }
+
+    public void setUid(Integer uid) {
+        this.uid = uid;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    @Override
+    public String toString() {
+        return "SysUser{" +
+                "uid=" + uid +
+                ", username='" + username + '\'' +
+                ", password='" + password + '\'' +
+                '}';
+    }
+}

+ 53 - 0
tomcat-demo/src/main/java/com/sf/sysdemo/util/JDBCUtil.java

@@ -0,0 +1,53 @@
+package com.sf.sysdemo.util;
+
+import com.alibaba.druid.pool.DruidDataSourceFactory;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+// 工具类
+public class JDBCUtil {
+
+    // 提供一个静态的数据源
+    private static DataSource dataSource;
+    // 静态初始化块
+    static {
+        Properties properties = new Properties();
+        // 获得类加载器
+        ClassLoader classLoader = JDBCUtil.class.getClassLoader();
+        // 加载指定配置文件 获取输入流
+        InputStream inputStream = classLoader.getResourceAsStream("jdbc.properties");
+        try {
+            // 将输入流加载进 properties对象中
+            properties.load(inputStream);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        // 通过druid提供的工厂类 来创建出数据源
+        try {
+            dataSource = DruidDataSourceFactory.createDataSource(properties);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    // 提供数据源
+    public static DataSource getDataSource() {
+        return dataSource;
+    }
+
+    // 提供数据库的连接
+    public static Connection getConnection(){
+        try {
+            Connection connection = dataSource.getConnection();
+            return connection;
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

+ 9 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/LoginServlet.java

@@ -18,6 +18,10 @@ import java.util.List;
 // http://localhost:8080/tomcat_demo/login
 public class LoginServlet extends HttpServlet {
 
+    public LoginServlet() {
+        System.out.println("LoginServlet Constructor");
+    }
+
     // 需要实现的service是ServletRequest  不是HttpServletRequest
 //    @Override
 //    public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
@@ -25,6 +29,11 @@ public class LoginServlet extends HttpServlet {
 //    }
 
 
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("LoginServlet service");
+    }
+
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 //        super.doGet(req, resp);

+ 26 - 1
tomcat-demo/src/main/java/com/sf/tomcatdemo/UserServlet.java

@@ -1,6 +1,7 @@
 package com.sf.tomcatdemo;
 
 import jakarta.servlet.ServletConfig;
+import jakarta.servlet.ServletContext;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
@@ -38,7 +39,7 @@ public class UserServlet extends HttpServlet {
 
         System.out.println("------------UserServlet Config-----------");
         // 获取config配置项 初始化参数
-        ServletConfig servletConfig = getServletConfig();
+        ServletConfig servletConfig = this.getServletConfig();
         // 获取所有参数名 返回一个枚举
         Enumeration<String> parameterNames = servletConfig.getInitParameterNames();
         while (parameterNames.hasMoreElements()) {
@@ -48,6 +49,30 @@ public class UserServlet extends HttpServlet {
             System.out.println(parameterName + "=" + parameterValue);
         }
 
+        String servletName = servletConfig.getServletName();
+        System.out.println(servletName);
+
+        // ServletContext 是web应用的上下文
+        ServletContext servletContext = servletConfig.getServletContext();
+        String contextPath1 = servletContext.getContextPath();
+        System.out.println(contextPath1);
+
+//       <context-param>
+//            <param-name>param1</param-name>
+//            <param-value>value1</param-value>
+//      </context-param>
+        String value1 = servletContext.getInitParameter("param1");
+        System.out.println("param1=" + value1);
+        System.out.println("------------------------");
+
+        // 获取所有的初始化参数
+        Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
+        while (initParameterNames.hasMoreElements()) {
+            String initParameterName = initParameterNames.nextElement();
+            String initParameterValue = servletContext.getInitParameter(initParameterName);
+            System.out.println(initParameterName + "=" + initParameterValue);
+        }
+
         // 静态资源和动态资源
         // html页面本身是静态资源  这里拼接的动态效果 是动态资源
 

+ 36 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/forward/ForwardServlet1.java

@@ -0,0 +1,36 @@
+package com.sf.tomcatdemo.forward;
+
+import jakarta.servlet.RequestDispatcher;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+// http://localhost:8080/forward-servlet1?param=123
+@WebServlet(
+        name = "ForwardServlet1",
+        value = "/forward-servlet1"
+)
+public class ForwardServlet1 extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("ForwardServlet1 service");
+        // 获取请求转发器
+        RequestDispatcher requestDispatcher = req.getRequestDispatcher("forward-servlet2");
+        // 转发静态资源
+//        RequestDispatcher requestDispatcher = req.getRequestDispatcher("success.html");
+        // 转发外部资源地址 不可以
+//        RequestDispatcher requestDispatcher = req.getRequestDispatcher("https://www.koobietech.com/#/");
+        String value = req.getParameter("param");
+        System.out.println(value);
+
+        // 在当前servlet中可以添加属性  使得servlet2可以根据属性进行处理
+        req.setAttribute("param1", "value1");
+        // 做出转发动作
+        requestDispatcher.forward(req, resp);
+    }
+}

+ 31 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/forward/ForwardServlet2.java

@@ -0,0 +1,31 @@
+package com.sf.tomcatdemo.forward;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+@WebServlet(
+        name = "ForwardServlet2",
+        value = "/forward-servlet2"
+)
+public class ForwardServlet2 extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("ForwardServlet2 service");
+        String value = req.getParameter("param");
+        System.out.println("param: " + value);
+
+        String value1 = (String) req.getAttribute("param1");
+        System.out.println("param1: " + value1);
+
+        // 在这里做出响应
+        PrintWriter writer = resp.getWriter();
+        writer.write("Hello ForwardServlet2");
+    }
+}

+ 27 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/redirect/RedirectServlet1.java

@@ -0,0 +1,27 @@
+package com.sf.tomcatdemo.redirect;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+// http://localhost:8080/redirect-servlet1
+@WebServlet(
+        name = "RedirectServlet1",
+        value = "/redirect-servlet1"
+)
+public class RedirectServlet1 extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("RedirectServlet1 service");
+        // 响应重定向
+        // 告诉客户端再发起一笔请求到 redirect-servlet2
+//        resp.sendRedirect("redirect-servlet2");
+        // 重定向可以访问到外部资源
+        resp.sendRedirect("https://www.koobietech.com/#/");
+    }
+}

+ 22 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/redirect/RedirectServlet2.java

@@ -0,0 +1,22 @@
+package com.sf.tomcatdemo.redirect;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+
+@WebServlet(
+        name = "RedirectServlet2",
+        value = "/redirect-servlet2"
+)
+public class RedirectServlet2 extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("RedirectServlet2 service");
+        resp.getWriter().write("RedirectServlet2 resp");
+    }
+}

+ 76 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/req_resp/ReqServlet.java

@@ -0,0 +1,76 @@
+package com.sf.tomcatdemo.req_resp;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+// 参数可以有多个 使用&&进行拼接
+// http://localhost:8080/req-servlet?param=123&&param1=1&&param2=2
+@WebServlet(
+        name = "reqServlet",
+        value = "/req-servlet"
+)
+public class ReqServlet extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("ReqServlet service");
+        // 请求方式
+        String method = req.getMethod();
+        System.out.println("method: " + method);
+        // 请求资源
+        String requestURI = req.getRequestURI();
+        System.out.println("requestURI: " + requestURI);
+        // 应用上下文 应用名称
+        String contextPath = req.getContextPath();
+        System.out.println("contextPath: " + contextPath);
+
+        // 请求url
+        StringBuffer requestURL = req.getRequestURL();
+        System.out.println("requestURL: " + requestURL);
+
+        // 客户端发送请求的端口号
+        int serverPort = req.getServerPort();
+        System.out.println("serverPort: " + serverPort);
+
+        // 容器的端口号
+        int localPort = req.getLocalPort();
+        System.out.println("localPort: " + localPort);
+
+        // 请求协议
+        String scheme = req.getScheme();
+        System.out.println("scheme: " + scheme);
+
+        // 协议和版本号
+        String protocol = req.getProtocol();
+        System.out.println("protocol: " + protocol);
+
+        // 处理参数
+        // 查询字符串
+        // http://localhost:8080/req-servlet?param=123  这里指param=123
+        String queryString = req.getQueryString();
+        System.out.println("queryString: " + queryString);
+
+        // 获取单个的参数值
+        String value = req.getParameter("param");
+        System.out.println("param: " + value);
+
+        // http://localhost:8080/req-servlet?param=123&&param1=1&&param2=2
+        Enumeration<String> parameterNames = req.getParameterNames();
+        // 遍历枚举
+        while (parameterNames.hasMoreElements()) {
+            // 获取下一个元素
+            String parameterName = parameterNames.nextElement();
+            String parameterValue = req.getParameter(parameterName);
+            System.out.println(parameterName + ": " + parameterValue);
+        }
+
+//        req.getParameterMap()
+
+    }
+}

+ 51 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/req_resp/RespServlet.java

@@ -0,0 +1,51 @@
+package com.sf.tomcatdemo.req_resp;
+
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.annotation.WebServlet;
+import jakarta.servlet.http.HttpServlet;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+
+// http://localhost:8080/resp-servlet
+@WebServlet(
+        name = "respServlet",
+        value = "/resp-servlet"
+)
+public class RespServlet extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("RespServlet service");
+
+        // 避免中文乱码 设置请求的编码格式
+        req.setCharacterEncoding("utf-8");
+
+        // 设置响应的 内容类型 以及 编码格式
+        resp.setContentType("text/html;charset=UTF-8");
+        // 设置响应 状态码
+        resp.setStatus(HttpServletResponse.SC_OK);
+
+        // 第一种 直接返回html内容
+        // 把内容写入响应体中的字符输出流
+        PrintWriter out = resp.getWriter();
+        out.println("<html><body>");
+        out.println("<h1>" + "hello resp" + "</h1>");
+        out.println("</body></html>");
+
+        // 这里是字节输出流
+//        ServletOutputStream outputStream = resp.getOutputStream();
+
+        // 第二种 返回js代码
+//        PrintWriter writer = resp.getWriter();
+//        writer.print("<script>alert('请通过post登录');location.href='/login.html'</script>");
+
+        // 第三种 根据不同的处理结果 进行分发
+//        req.getRequestDispatcher("/success.html").forward(req, resp);
+
+
+    }
+}

+ 8 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/startup/MyServlet1.java

@@ -1,5 +1,6 @@
 package com.sf.tomcatdemo.startup;
 
+import jakarta.servlet.ServletContext;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
@@ -12,6 +13,13 @@ public class MyServlet1 extends HttpServlet {
     @Override
     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         System.out.println("MyServlet1 service");
+
+        ServletContext servletContext = this.getServletContext();
+        // 设置一个属性值 key=name value="tomcat-demo"
+        servletContext.setAttribute("name", "tomcat-demo");
+        // ServletContext还可以实现请求的转发
+        // 也可以加载文件
+//        servletContext.getRequestDispatcher()
     }
 
     @Override

+ 6 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/startup/MyServlet2.java

@@ -1,5 +1,6 @@
 package com.sf.tomcatdemo.startup;
 
+import jakarta.servlet.ServletContext;
 import jakarta.servlet.ServletException;
 import jakarta.servlet.http.HttpServlet;
 import jakarta.servlet.http.HttpServletRequest;
@@ -12,6 +13,11 @@ public class MyServlet2 extends HttpServlet {
     @Override
     protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         System.out.println("MyServlet2 service");
+
+        ServletContext servletContext = this.getServletContext();
+        // 通过key获取value  直接得到Object类型 强转String类型
+        String value = (String)servletContext.getAttribute("name");
+        System.out.println(value);
     }
 
     @Override

+ 21 - 0
tomcat-demo/src/main/java/com/sf/tomcatdemo/startup/MyServlet3.java

@@ -0,0 +1,21 @@
+package com.sf.tomcatdemo.startup;
+
+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 MyServlet3 extends HttpServlet {
+
+    @Override
+    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+        System.out.println("MyServlet3 service");
+
+        ServletContext servletContext = this.getServletContext();
+        // 移除属性值
+        servletContext.removeAttribute("name");
+    }
+}

+ 7 - 0
tomcat-demo/src/main/resources/jdbc.properties

@@ -0,0 +1,7 @@
+# driverClassName=com.mysql.jdbc.Driver  mysql5.7
+driverClassName=com.mysql.cj.jdbc.Driver
+url=jdbc:mysql://localhost:3306/test?useUnicode=true
+# 注意改成自己的数据库名
+username=root
+password=123456
+# 注意改成自己的数据库用户名和密码

+ 19 - 0
tomcat-demo/src/main/webapp/WEB-INF/web.xml

@@ -15,6 +15,15 @@
         <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>
 
+    <context-param>
+        <param-name>param1</param-name>
+        <param-value>value1</param-value>
+    </context-param>
+    <context-param>
+        <param-name>param2</param-name>
+        <param-value>value2</param-value>
+    </context-param>
+
     <!--  有这样一个Servlet 声明名字和对应的类路径  -->
     <!--  可以通过反射 使用类路径来创建对象 然后调用对象的service方法  -->
     <servlet>
@@ -71,4 +80,14 @@
         <url-pattern>/servlet2</url-pattern>
     </servlet-mapping>
 
+    <servlet>
+        <servlet-name>MyServlet3</servlet-name>
+        <servlet-class>com.sf.tomcatdemo.startup.MyServlet3</servlet-class>
+        <load-on-startup>3</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>MyServlet3</servlet-name>
+        <url-pattern>/servlet3</url-pattern>
+    </servlet-mapping>
+
 </web-app>