前置条件:请创建数据库:
1. 创建servlets
a. 在src目录下新建一个servlets包
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);
}
}
可以通过导入Java EE 6的包解决此问题:
2. 了解MVC模式。创建Model,也就是数据模型
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加载过程(步骤):
- 启动web项目,容器(如Tomcat、Apache)会去读取它的配置文件web.xml 中的两个节点,context-param和listener。
- 紧接着,容器将创建一个ServletContext(又称为:Servlet上下文),应用范围内即整个WEB项目都能使用这个Servlet上下文。
- 容器将< context-param >转化为键值对,并交给ServletContext。
- 容器创建< listener >中的类实例,即创建监听。(备注:listener定义的类可以是自定义的类但必须需要继承ServletContextListener)。
- 在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得:ServletContext = ServletContextEvent.getServletContext(); context-param的值 = ServletContext.getInitParameter(“context-param的键”); 在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法。用于关闭应用前释放资源,比如说数据库连接的关闭。
- 得到这个context-param的值之后,你就可以做一些操作了。注意,这个时候你的WEB项目还没有完全启动完成。这个动作会比所有的Servlet都要早。换句话说,这个时候,你对 < context-param > 中的键值做的操作,将在你的WEB项目完全启动之前被执行。
- 举例.你可能想在项目启动之前就打开数据库。那么这里就可以在< 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
-
Servlet名称,可以自定义,但是需要遵守规则:比如指定为Spring,那么最好在classpath路径中配置Spring-servlet.xml,否则需要在子元素特别指出;
-
因为要配置MVC,所以指定为:org.springframework.web.servlet.DispatcherServlet;
-
定义容器启动时初始化的配置文件,作用主要是指定自定义配置文件的路径,貌似可以指定多个;
- [contextConfigLocation]
- 可以自定义,如:classpath:spring-servlet.xml,如果不定义,那么默认为:classpath:${servlet-name}-servlet.xml
- 定义为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相对应
-
与对应的servlet的name保持一致;
-
一般定义为“/”,表示所有请求都通过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
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加载此项目,运行效果如图所示:
源码通道: github.com/wilzat-pro/…