基于MVC的留言板项目——maven、JavaBean+Servlet+JSP

原理

MVC——M(Javabean)+V(jsp)+C(servlet)
在这里插入图片描述
在这里插入图片描述

开发步骤

项目准备:
1、Maven项目 -> webapp项目
2、在main下新建两个文件夹,java 、 resources 文件夹。
3、modules配置两文件夹类型。

开发代码:
1、引入支持jar pom -> javax.servlet-api(注意版本正确才可以使用注解)
2、UserServlet extends HttpServlet
3、编写servlet
4、配置tomcat - 启动tomcat

第一步

1. 新建maven项目

File → New → Project → Maven →
Create from archetype 前的复选框~不打钩,则创建的是一个空的maven工程 /

打钩,并选择 org.apache.maven.archetypes: maven-archetype-quickstart (快速开启模式)~适用于普通的java工程等
打钩,并选择org.apache.maven.archetypes:maven-archetype-webapp (创建的是javaWeb工程)

→ 填一下项目名、项目位置 → 然后再配置一下maven的:
Maven home path:配置maven的安装路径;
User settings file: maven的配置文件;
Local repository:本地仓库位置;

ps: IDEA的每个maven项目,每次都要重复配置Maven =>解决:IDEA中全局默认配置中去配置maven
——全局配置maven:File → New Projects Settings → Settings for New Projects →搜索框搜Maven → 配置maven的安装路径、配置文件路径、本地仓库路径

■ 安装目录 Maven home directory

■ maven的配置 User settings file

■ 本地仓库 Local repository


在这里插入图片描述
注意:

  1. 新建maven项目
  2. 勾选 create from archetype,则选择所建项目内容;不勾选则建立空项目
  3. 此时建立webapp,选择如图

在这里插入图片描述

建立留言功能项目,message
在这里插入图片描述

此处不需要填写,idea自带maven,如果此处需要填写需自行安装

在这里插入图片描述
注意保证网络畅通,因为需要下载本地库(官网)的jar包

2. 完善结构

在这里插入图片描述
与模板所给的结构不同

文件夹

在这里插入图片描述
在这里插入图片描述
更改版本:
在这里插入图片描述
安装的jdk13,需要自己更改

注意:
在这里插入图片描述

改变文件夹类型
  1. 在新建文件夹时选择
  2. 右键要更改的文件夹
    在这里插入图片描述
  3. file→project structure
    在这里插入图片描述

包package

java文件夹(=javabean):
新建package——entity、Dao、servlet
在这里插入图片描述

3. 依赖管理,更新pom

在这里插入图片描述
首先,原有模板引入了junit(测试),不用可以去掉

引入:
在这里插入图片描述

  • 当有不存在的jar时输入内容会标红,此时可以点击右上角出现的标志下载相关jar包
<dependencies>
<!--    jsp-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.0.1</version>
    </dependency>

<!--    jdbc-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>

<!--    jstl-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>

  </dependencies>

引入失败not found

Could not find artifact xxx:xxx:pom: in nexus-aliyun
IDEA使用Maven工具导入servlet-api包后,编译项目时仍提示找不到javax.servlet.http包的原因及解决方案

第二步 BaseDao 📕

在这里插入图片描述

BaseDao.java

package Dao;

//使用BaseDao(优化JDBC),泛型、反射,无连接池,包含公共DQL、DML


import javax.sql.DataSource;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

    public abstract class BaseDao<T> {
        //CRUD操作代码
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/text?useSSL=false";
        String name = "root";
        String pass = "123456";

//    private static DataSource dataSource = new ComboPooledDataSource();

        Class<T> clazz;
        //反射获得clazz
        @SuppressWarnings("unchecked")
        public BaseDao() {
            clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }

        public Connection getConnection(){
            Connection connection = null;
            try {
//            //注册驱动 (仅仅做一次)
                Class.forName(driver);
//            //建立连接(Connection)
                connection = DriverManager.getConnection(url, name, pass);
//            connection = dataSource.getConnection();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return connection;
        }

        //DQL
        public void closeAll(ResultSet resultSet, Statement statement, Connection connection){
            //释放资源(conn、statement、rs)
            try {
                if(resultSet != null){
                    resultSet.close();
                }
                if(statement != null){
                    statement.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        //DML
        public void closeAll(Statement statement, Connection connection){
            //释放资源(conn、statement、rs)
            try {
                if(statement != null){
                    statement.close();
                }
                if(connection != null){
                    connection.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }




        public int excuteUpdate(String sql,Object... objects) {
            Connection connection = null;
            PreparedStatement statement = null;
            int ret = -1;
            try {
                connection = getConnection();
                //创建运行SQL的语句(Statement)
                statement = connection.prepareStatement(sql);
                for (int i = 0; i < objects.length; i++) {
                    statement.setObject(i+1, objects[i]);
                }
                //运行语句
                ret = statement.executeUpdate();
                System.out.println(ret);
                //处理运行结果(ResultSet)
            } catch (SQLException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeAll(statement,connection);
            }
            return ret;
        }

        //执行预编译DQL语句
        public List<T> executeQuery(String sql, Object... param) {
            Connection conn = null;
            PreparedStatement stat = null;
            ResultSet rs = null;
            List<T> list = new ArrayList<T>();
            try {
                conn = getConnection();
                stat = conn.prepareStatement(sql);
                if (param != null) {
                    for (int i = 0; i < param.length; i++) {
                        stat.setObject(i + 1, param[i]);
                    }
                }
                rs = stat.executeQuery();
                ResultSetMetaData rsmd = rs.getMetaData();
                int columuCount = rsmd.getColumnCount();
                while (rs.next()) {
                    T t = (T) clazz.newInstance();
                    for (int i = 0; i < columuCount; i++) {
                        Field f = clazz.getDeclaredField(rsmd.getColumnName(i + 1));
                        f.setAccessible(true);
                        f.set(t, rs.getObject(i + 1));
                    }
                    list.add(t);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeAll(rs,stat,conn);
            }
            return list;
        }
    }

MessageDao.java

package Dao;

import entity.Message;
import java.util.List;

public class MessageDao extends BaseDao<Message>{
    public int insert(Message message){
        return excuteUpdate( "insert into msgboard (author,msg) values (?,?)",message.getAuthor(),message.getMsg());

    }
    //分页查询 bypage limit
    public List<Message> getMessageByPage(int start,int limit){
        return executeQuery("select * from msgboard limit ?,?",start,limit);
    }


}

Message.java

package entity;

import java.util.Date;

public class Message {
//    私有属性
    private int id;
    private String author;
    private String msg;
    private Date date;
//重写toString(),显示输出内容


    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", author='" + author + '\'' +
                ", msg='" + msg + '\'' +
                ", date=" + date +
                '}';
    }

    //setter&getter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

Text.java

使用java应用程序来打印数据
在这里插入图片描述

import Dao.MessageDao;
import entity.Message;

public class Text {
    public static void main(String[] args) {
        MessageDao messageDao = new MessageDao();
        Message message=new Message();
//        插入
//        message.setAuthor("alixy");
//        message.setMsg("bob");
//       // messageDao.insert(message);
//        System.out.println(messageDao.insert(message));



//        分页查询
        messageDao.getMessageByPage(0,3).forEach(System.out::println);//注意maven1.8才可以使用
    }
}

测试代码正确可以删除text,编写servlet

第三步 servlet

1. 新建servlet

详解idea文件右键创建New没有Create New Servlet的解决办法

在这里插入图片描述
= >生成
在这里插入图片描述
在这里插入图片描述
有两种方式doPosr()和doGet()

2.代码

tomcat配置、启用
  • 配置Tomcat:
    点击IDEA中的Add Configuration,或者打开菜单Run --> 选择Edit Configuration 都可以。
    弹出窗口后点击+,然后往下滑,然后选择Tomcat Server的Local(如果没有Tomcat Server则点击 items more)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 删除虚拟路径,保证网页中访问连接为删除虚拟路径,填入 / ,保证网页中访问连接为http://localhost:8080
    在这里插入图片描述

在这里插入图片描述

  • 热部署
    在这里插入图片描述
使用servlet打印数据

在这里插入图片描述

package servlet;

import Dao.MessageDao;
import entity.Message;

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;



@WebServlet("/show")
public class MessageServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        MessageDao messageDao = new MessageDao();
        messageDao.getMessageByPage(0,3).forEach(System.out::println);   //分页查询
    }
}

http://localhost:8080 → http://localhost:8080/show
在这里插入图片描述
结果:
在这里插入图片描述

第四步 servlet深入+JSP

(1) MessageServlet.java 📕

package servlet;

import Dao.MessageDao;
import entity.Message;

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.util.List;

@WebServlet("/show")
public class MessageServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /* servlet - javabean → DB */
        MessageDao messageDao = new MessageDao();
        //messageDao.getMessageByPage(0,3).forEach(System.out::println);   //打印过程不正确

        List<Message> messageList=messageDao.getMessageByPage(0,3);
          /* list → jsp
          servlet → jsp(servlet)=转发
          转发+request  */
        request.setAttribute("msgList",messageList);
        request.getRequestDispatcher("message.jsp").forward(request,response);

    }
}

(2) JSP

1. 在webapp文件夹中新建message.jsp

在这里插入图片描述
IDEA jsp 无法自动提示代码问题

前端内容:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
 <!DOCTYPE html>
 <html lang="en">
 <head>
     <title>留言板</title>
     <meta charset="UTF-8">
     <style>
         div {
             margin: 0;
             padding: 0;
             font-size: 12px;
             margin: 0 auto;
         }

         h3 {
             text-align: center
         }

         #container {
             width: 500px;
         }

         .article {
             border: 1px solid #a6cbe7;
             margin-top: 5px;
         }

         .author {
             background-color: #0099FF;
             width: 100%;
             height: 24px;
             line-height: 24px;
         }

         .content {
             height: 40px;
             padding: 10px;
         }

         .author span {
             float: right;
             padding-right: 10px;
         }

         .time {
             border-top: solid 1px #a6cbe7;
         }

         .page {
             text-align: right;
             height: 30px;
             line-height: 30px;
             padding-right: 10px;
         }
     </style>
 </head>

 <body>
 <div id="container">
     <div><h3>留言板</h3></div>
     <div>
         用户:<input type="text" name="searchAuthor"> 留言:<input type="text" name="searchMsg"> <input id="search" type="button" value="搜索">
             <div class="article"v-for="msg in msgs">
                 <div class="author">用户:{{msg.author}}<span>{{msg.id}}#</span></div>
                 <div class="content">{{msg.msg}}</div>
                 <div class="time page">发表于:{{msg.date}}</div>
             </div>
     </div>

     <div class="page">
         <span id="prePage">上一页</span> <span id="nextPage">下一页</span>
     </div>
     <br>
     <div>
         <form>
             <div>
                 用户: <input type="text" name="author" value=""/>
             </div>
             <br>
             <div>
                 留言: <textarea name="message" rows="5" cols="72"></textarea>
             </div>
             <div align="center"><input type="reset" value="清除"/> <input id="submit" type="button" value="发表"/></div>
         </form>
     </div>
 </div>
 </body>
 </html>

2. jsp —— 脚本、小脚本

在这里插入图片描述
第二步中实现了控制台输出数据。这里完成了数据的页面输出。
在这里插入图片描述
调整:
在这里插入图片描述
在这里插入图片描述

3. JSP —— jstl + el

① 引入taglib

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  • 补充:
    el用于访问对象
    在这里插入图片描述el
    作用域:
    按 application -> session ->request ->page 查找,没有不输出。多个存在并想要固定输出时(user),可加(requestScope.user)前缀,则去固定作用域取值。
    jstl的taglib标签:在这里插入图片描述

② jstl
在这里插入图片描述
<c:forEach>——配置var-对象;items-集合;begin end-从x到 x;step-步数;varStatus-状态

等价于:
for (Message msg : list)

③ 引入el表达式

<%@ page isELIgnored="false" %>

④ el(类似vue的写法)
在MessageServlet.java中数存在request:
在这里插入图片描述
则items为
在这里插入图片描述

message.jsp 📕

<-- 使用传统模型后就不重要了
<%@ page import="java.util.List" %>
<%@ page import="entity.Message" %>
-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入taglib--%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--引入el表达式--%>
<%@ page isELIgnored="false" %>

<!DOCTYPE html>
 <html lang="en">
 <head>
     <title>留言板</title>
     <meta charset="UTF-8">
     <style>
         div {
             margin: 0;
             padding: 0;
             font-size: 12px;
             margin: 0 auto;
         }

         h3 {
             text-align: center
         }

         #container {
             width: 500px;
         }

         .article {
             border: 1px solid #a6cbe7;
             margin-top: 5px;
         }

         .author {
             background-color: #0099FF;
             width: 100%;
             height: 24px;
             line-height: 24px;
         }

         .content {
             height: 40px;
             padding: 10px;
         }

         .author span {
             float: right;
             padding-right: 10px;
         }

         .time {
             border-top: solid 1px #a6cbe7;
         }

         .page {
             text-align: right;
             height: 30px;
             line-height: 30px;
             padding-right: 10px;
         }
     </style>
 </head>

 <body>
 <div id="container">
     <div><h3>留言板</h3></div>

<%--  1. 脚本 (已经被代替) --%>
<%--     <%request.getAttribute("msgList");%>--%>
<%--     从msgList取出List,attribute返回object对象(同集合),
存的时候向 上转型成object,取得时候需要把object向下转型成List--%>


<%--  2. 小脚本 Java写法,强转  --%>
     <%--<%List<Message> list =(List) request.getAttribute("msgList");%>
     <%for(int i=0 ; i< list.size() ; i++) {
         out.print(list.get(i));
     }%>--%>


     <%--  3. 小脚本 优化  --%>
     <%--<%List<Message> list =(List) request.getAttribute("msgList");%>
     <div>
         用户:<input type="text" name="searchAuthor"> 留言:<input type="text" name="searchMsg"> <input id="search" type="button" value="搜索">
         <%for(int i=0 ; i< list.size() ; i++){ %>
         <div class="article">
             <div class="author">用户:<%out.print(list.get(i).getAuthor());%><span>{{msg.id}}</span></div>
             <div class="content"><%=%>(list.get(i).getAuthor());%></div>
             <div class="time page">发表于:{{msg.date}}</div>
         </div>
            <%}%>
     </div>--%>


<%--    4. jstl+el    --%>
     <div>
         用户:<input type="text" name="searchAuthor"> 留言:<input type="text" name="searchMsg"> <input id="search" type="button" value="搜索">

         <c:forEach var="msg" items="${requestScope.msgList}">
             <%--需要循环迭代的对象msg所在list集合。items存在作用域问题--%>
             <div class="article">
                     <%--el表达式--%>
                 <div class="author">用户:${msg.author}<span>${msg.id}#</span></div>
                 <div class="content">${msg.msg}</div>
                 <div class="time page">发表于:${msg.date}</div>
             </div>
         </c:forEach>
     </div>

     <div class="page">
         <span id="prePage">上一页</span> <span id="nextPage">下一页</span>
     </div>
     <br>
     <div>
         <form>
             <div>
                 用户: <input type="text" name="author" value=""/>
             </div>
             <br>
             <div>
                 留言: <textarea name="message" rows="5" cols="72"></textarea>
             </div>
             <div align="center"><input type="reset" value="清除"/> <input id="submit" type="button" value="发表"/></div>
         </form>
     </div>
 </div>
 </body>
 </html>

结果
在这里插入图片描述

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
想要通过 MavenServlet 现查询数据库表并将结果显示在网页上,可以按照以下步骤进行操作: 1. 首先,确保已经在项目中配置了 Maven 依赖管理工具。在 pom.xml 文件中添加相应的依赖,包括 Servlet API、数据库驱动程序和其他必要的库。 2. 在项目中创建一个 Servlet 类。在该类的 doGet() 方法中数据库查询的逻辑。可以使用 Java 的 JDBC API 来连接数据库,并编写 SQL 查询语句来获取所需的数据。执行查询后,将结果保存在适当的数据结构中。 3. 创建一个 JSP 文件,用于显示查询结果。在 JSP 文件中,可以使用 Java 代码片段和 JSP 标签来获取并显示查询结果。使用 JSTLJSP 标准标签库)可以更方便地处理数据。根据需要,可以使用 HTML 和 CSS 来美化页面。 4. 在 Servlet 类中的 doGet() 方法中,使用 request.getRequestDispatcher() 方法获取 JSP 文件的请求分派器。然后,将查询结果作为属性(attribute)设置在请求中,并将请求分派到 JSP 页面。 5. 在 JSP 页面中,使用 JSTL 标签和 Java 代码片段来获取查询结果,并将其在网页上显示出来。可以根据需要使用循环、条件和其他功能来处理和展示数据。 6. 运行项目并访问相应的 URL,即可看到从数据库中查询到的数据在网页上的显示。 总结来说,通过 Maven 管理依赖,使用 Servlet 连接数据库并编写SQL查询语句,然后将查询到的结果通过 JSP 页面展示出来,就可以现在网页上显示数据库表的功能。通过合理利用 Java、HTML、CSS 和 JSTL 等技术,可以现更灵活、美观的数据展示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值