从头开始系列三——idea如何将获取到的数据库数据显示到jsp页面上

78 阅读3分钟

前置条件:请创建数据库:

1.png

1. 创建servlets

a. 在src目录下新建一个servlets包

2.png

b. 创建一个servlet

package servlets; 

import entity.Student; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import java.sql.*; 
import java.util.ArrayList; 

public class ServletDemo extends HttpServlet { 

    public ServletDemo() { 
        super(); 
    } 
    
    @Override 
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
        try { 
            Class.forName("com.mysql.jdbc.Driver"); 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } 
        
        System.out.println("ServletDemo.service"); 
        Connection connection = null; 
        Statement statement = null; 
        ResultSet resultSet = null; 
        ArrayList<Student> list = new ArrayList<>(); 
        
        // 连接数据库 
        String url = "jdbc:mysql://localhost:3306/数据库名?userSSL=true&userUnicode=true&characterEncoding=utf-8"; 
        // 用户名 密码 
        String username = "数据库用户名"; 
        String pwd = "数据库密码"; 
        
        // sql语句,使用数据库的student表 
        String sql = "SELECT * FROM student"; 
        
        try { 
            connection = DriverManager.getConnection(url, username, pwd); 
            statement = connection.createStatement(); 
            resultSet = statement.executeQuery(sql); 
            
            while (resultSet.next()) { 
                Long stuid = (Long) resultSet.getObject("stuid"); 
                String name = (String) resultSet.getObject("name"); 
                String sex = (String) resultSet.getObject("sex"); 
                Integer age = (Integer) resultSet.getObject("age"); 
                Student stu = new Student(stuid, name, sex, age); 
                list.add(stu); 
            } 
            
            resultSet.close(); 
            statement.close(); 
            connection.close(); 
        }catch (Exception e){ 
            System.out.println(e); 
        } 
        
        req.setAttribute("demolist", list);
        req.getRequestDispatcher("index.jsp").forward(req,resp); 
    } 
}

注意:同学们在代码块内使用HttpServlet的时候会出现识别不了HttpServlet的情况\color{#ff0000}{注意:同学们在代码块内使用HttpServlet的时候会出现识别不了HttpServlet的情况}

可以通过导入Java EE 6的包解决此问题:

3.png

2. 了解MVC模式。创建Model,也就是数据模型

4.png

package entity;

public class Student { 
    private Long stuid; 
    private String name; 
    private String sex; 
    private Integer age; 
    
    public Long getStuid() { return stuid; } 
    public String getName() { return name; } 
    public String getSex() { return sex; } 
    public Integer getAge() { return age; } 
    
    public void setStuid(Long stuid) { this.stuid = stuid; } 
    public void setName(String name) { this.name = name; } 
    public void setSex(String sex) { this.sex = sex; } 
    public void setAge(Integer age) { this.age = age; } 
    
    public Student(Long stuid, String name, String sex, Integer age) { 
        this.stuid = stuid; 
        this.name = name; 
        this.sex = sex; 
        this.age = age; 
    } 
}

3. 配置web.xml文件(重要)

a. 了解java web项目启动的执行顺序

① web.xml加载过程(步骤):
  1. 启动web项目,容器(如Tomcat、Apache)会去读取它的配置文件web.xml 中的两个节点,context-param和listener。
  2. 紧接着,容器将创建一个ServletContext(又称为:Servlet上下文),应用范围内即整个WEB项目都能使用这个Servlet上下文。
  3. 容器将< context-param >转化为键值对,并交给ServletContext。
  4. 容器创建< listener >中的类实例,即创建监听。(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
  5. 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得:ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的键”); 在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法。用于关闭应用前释放资源,比如说数据库连接的关闭。
  6. 得到这个context-param的值之后,你就可以做一些操作了。注意,这个时候你的WEB项目还没有完全启动完成。这个动作会比所有的Servlet都要早。换句话说,这个时候,你对 < context-param > 中的键值做的操作,将在你的WEB项目完全启动之前被执行。
  7. 举例.你可能想在项目启动之前就打开数据库。那么这里就可以在< context-param >中设置数据库的连接方式,在监听类中初始化数据库的连接。
② web.xml节点加载顺序:
  • web.xml节点的加载顺序与它们在web.xml中位置的先后无关,即不会因为< filter >写在< context-param >前面就先加载< filter >。

  • 上文也提到到了,< context-param >用于对ServletContext提供键值对,即应用程序的上下文信息。而listener、servlet等节点在初始化的过程中会使用到这些上下文信息,所以最后我们得出web.xml节点的加载顺序应该为:context-param → listener → filter → servlet。

  • 对于某类配置节点而言,位置的先后是有要求的。以servlet举例,与servlet相关的配置节点是servlet-mapping,对于拥有相同配置节servlet-name的servlet和servlet-mapping来说,servlet-mapping必须在servlet后定义,否则当解析到servlet-mapping时,它的servlet-name还没有定义。web 容器启动时初始化每个 servlet时,是按照 servlet配置节出现的顺序来初始化的。

  • 最终结论: web.xml 的加载顺序是:context-param → listener → filter → servlet → spring ,而同类型节点之间的实际程序调用的时候的顺序是根据对应的 mapping 的顺序进行调用的。

b. 配置内容:

<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_3_1.xsd" 
    version="3.1"> 
    <servlet> 
        <servlet-name>servletdemo</servlet-name> 
        <servlet-class>servlets.ServletDemo</servlet-class> 
    </servlet> 
    <servlet-mapping> 
        <servlet-name>servletdemo</servlet-name> 
        <url-pattern></url-pattern> 
    </servlet-mapping>
</web-app>

配置详解:(以SpringMVC为例)

servlet

  1. <servletname>\color{#ff0000}{<servlet-name>} Servlet名称,可以自定义,但是需要遵守规则:比如指定为Spring,那么最好在classpath路径中配置Spring-servlet.xml,否则需要在子元素特别指出;

  2. <servletclass>\color{#ff0000}{<servlet-class>} 因为要配置MVC,所以指定为:org.springframework.web.servlet.DispatcherServlet;

  3. <initparam>\color{#ff0000}{<init-param>} 定义容器启动时初始化的配置文件,作用主要是指定自定义配置文件的路径,貌似可以指定多个;

    • <paramname>\color{#ff0000}{<param-name>}[contextConfigLocation]
    • <paramvalue>\color{#ff0000}{<param-value>}可以自定义,如:classpath:spring-servlet.xml,如果不定义,那么默认为:classpath:${servlet-name}-servlet.xml
    • <loadonstartup>\color{#ff0000}{<load-on-startup>}定义为1,表示启动等级
<!-- 配置 spring mvc 的核心控制器 --> 
<servlet>
    <servlet-name>springmvcDispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置初始化参数,用于读取 springmvc 的配置文件 --> 
    <init-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath:dispatcher.xml</param-value> 
    </init-param> 
    <!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺 序 --> 
    <load-on-startup>1</load-on-startup> 
</servlet>

servlet-mapping

与servlet相对应

  1. <servletname>\color{#ff0000}{<servlet-name>}与对应的servlet的name保持一致;

  2. <urlpattern>\color{#ff0000}{<url-pattern>}一般定义为“/”,表示所有请求都通过DispatcherServlet来处理,但是这样处理的话会使静态资源都经过springmvc的中央调度器,而中央调度器不处理静态资源请求。所以我还是习惯用一个*.do这样的特殊路径格式。

<servlet-mapping> 
    <servlet-name>springmvcDispatcherServlet</servlet-name> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping>

4. JSP

a.导入jstl.jar包以使用

<%@taglib uri="java.sun.com/jsp/jstl/co…" prefix="c"%>

jar包部署到WEB-INF/lib下,导入包以后请添加到库add as Library

5.png

jsp页面如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@ page import="entity.Student "%>
<%@ page import="java.util.* "%> 
<!DOCTYPE html> 
    <html> 
        <head> 
            <title>从webdemo数据库中读出student表</title> 
        </head> 
        <body> 
            <div align="center"> 
                <h1 style="color: red;" align="center"> 所有成员信息列表</h1> 
                <table width="900"> 
                    <tr> 
                        <td> <h3 style="color: blue;">姓名</h3></td> <td><h3 style="color: blue;">学号</h3></td> 
                        <td><h3 style="color: blue;">性别</h3></td> 
                        <td><h3 style="color: blue;">年龄</h3></td> 
                    </tr> 
                    <% ArrayList<Student> demolist = (ArrayList<Student>)request.getAttribute("demolist");%> 
                    <%System.out.println("-------"+demolist);%> 
                    <% for (int i=0;i<demolist.size(); i++) {%> 
                    <% Student item = demolist.get(i); %> 
                        <tr> 
                            <td><%=item.getName()%></td> 
                            <td><%=item.getStuid()%></td> 
                            <td><%=item.getSex()%></td> 
                            <td><%=item.getAge()%></td> 
                        </tr> 
                    <%}%> 
                </table> 
            </div> 
        </body> 
    </html>

最后,启动tomcat加载此项目,运行效果如图所示:

6.png

源码通道: github.com/wilzat-pro/…