Struts2 + Hibernate完成单表新闻管理功能

2024-08-31 13:18

本文主要是介绍Struts2 + Hibernate完成单表新闻管理功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

将新闻的映射文件选择加入到hibernate.cfg.xml中:


后台完成后,在成功页suc.jsp中加入两个超连接。

        <center>

            用户登陆成功,当前登陆用户为: ${user.realName}

            <br />

            <hr />

            <br />

            <a href="pages/news/news_insert.jsp">添加新闻</a>

            <br />

            <a href="news!list.action">新闻列表</a>

            <br />

        </center>


先完成添加功能,编写news_insert.jsp

        <center>

            <form action="news!insert.action" method="post">

                新闻标题:<input type="text" name="news.title" /> <br/>

                新闻内容:<input type="text" name="news.content" /> <br/>

                新闻发布日期:<input type="text" name="news.pubDate" /> <br/>

                <input type="submit" value="添加"/>

            </form>

        </center>


完成Action,实现insert方法。

public class NewsAction extends ActionSupport {

 

    private News news;

 

    // 中间公共页要传递的数据

    // 提示的信息

    private String message;

    // 经过一定时间后,自动进入的页面路径

    private String url;

 

    public String insert() throws Exception {

        ServiceFactory.getINewsServiceInstance().insert(news);

        message = "新闻发布成功";

        url = "pages/suc.jsp";

 

        return "forward";

    }

在struts.xml中配置forward路径

        <action name="news" class="org.liky.action.NewsAction">

            <result name="forward">/forward.jsp</result>

        </action>


编写forward.jsp,完成定时跳转的公共页功能。

        <script type="text/javascript">

            var time = 5;

            function countDown() {

                document.getElementById("time_span").innerHTML = time;

                time--;

                if (time >= 0) {

                    // js中定时调用的方法

                    window.setTimeout("countDown();",1000);

                }

            }

        </script>

    </head>

 

    <body onload="countDown();">

        <center>

            <%

                response.setHeader("refresh","5;URL=" + basePath + request.getAttribute("url"));

            %>

            ${message },<span id="time_span">5</span> 秒后自动跳转!<br/>

            <a href="${url}">如果没有跳转,请点这里!</a>

        </center>

        <br>

    </body>


实现分页列表功能,先在Action中接收参数,并查询当前页的数据以及全部记录数,传递到页面上显示。

    public String list() throws Exception {

        Map<String, Object> map = ServiceFactory.getINewsServiceInstance()

                .list(pageNo, pageSize, keyword, column);

 

        allNews = (List<News>) map.get("allNews");

        count = (Integer) map.get("allCount");

       

        return "list";

    }

    // 分页中要接收的参数

    private int pageNo = 1;

    private int pageSize = 1;

    private String keyword = "";

    private String column = "title";

 

    // 向页面上传递的列表数据

    private List<News> allNews;

    private int count;

配置跳转路径

        <action name="news" class="org.liky.action.NewsAction">

            <result name="forward">/forward.jsp</result>

            <result name="list">/pages/news/news_list.jsp</result>

        </action>

完成news_list.jsp

            <table border="1" width="80%">

                <tr>

                    <td>

                        编号

                    </td>

                    <td>

                        标题

                    </td>

                    <td>

                        内容

                    </td>

                    <td>

                        发布日期

                    </td>

                    <td>

                        操作

                    </td>

                </tr>

                <c:forEach var="news" items="${allNews}">

                    <tr>

                        <td>

                            ${news.id }

                        </td>

                        <td>

                            ${news.title }

                        </td>

                        <td>

                            ${news.content }

                        </td>

                        <td>

                            <fmt:formatDate value="${news.pubDate}" pattern="yyyy-MM-dd"/>

                        </td>

                        <td>

                            修改

                            删除

                        </td>

                    </tr>

                </c:forEach>

            </table>

这里显示出了第一页的数据

 

先实现基本的翻页功能(上一页和下一页)

            <%

                int pageNo = (Integer)request.getAttribute("pageNo");

                int pageSize = (Integer)request.getAttribute("pageSize");

                int count = (Integer)request.getAttribute("count");

                // 总页数

                int allPages = (count - 1) / pageSize + 1;

            %>

            <form action="news!list.action" method="post" id="split_page">

                <input type="hidden" id="pageNo" name="pageNo" value="<%=pageNo %>"/>

                <input type="button" value="首页" onclick="changePage(1);">

                <input type="button" value="上一页" onclick="changePage(<%=pageNo - 1 %>);">

                <input type="button" value="下一页" onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value="尾页" onclick="changePage(<%=allPages %>);">

            </form>

           

            <script type="text/javascript">

                function changePage(newPage) {

                    document.getElementById("pageNo").value = newPage;

                    document.getElementById("split_page").submit();

                }

               

            </script>

加入限制,防止用户操作超过范围

            <form action="news!list.action" method="post" id="split_page">

                <input type="hidden" id="pageNo" name="pageNo" value="<%=pageNo %>"/>

                <input type="button" value="首页" <%=pageNo==1?"disabled":"" %> onclick="changePage(1);">

                <input type="button" value="上一页" <%=pageNo==1?"disabled":"" %> onclick="changePage(<%=pageNo - 1 %>);">

                <input type="button" value="下一页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value="尾页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=allPages %>);">

            </form>

 

加入跳转到某一页的功能,常见的有以下几种形式:

1)文本框形式:

            <%

                int pageNo = (Integer)request.getAttribute("pageNo");

                int pageSize = (Integer)request.getAttribute("pageSize");

                int count = (Integer)request.getAttribute("count");

                // 总页数

                int allPages = (count - 1) / pageSize + 1;

            %>

            <form action="news!list.action" method="post" id="split_page" onsubmit="return checkPageNo();">             

                <input type="button" value="首页" <%=pageNo==1?"disabled":"" %> onclick="changePage(1);">

                <input type="button" value="上一页" <%=pageNo==1?"disabled":"" %> onclick="changePage(<%=pageNo - 1 %>);">

                <input type="button" value="下一页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value="尾页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=allPages %>);">

               

                跳转到

                <input type="text" id="pageNo" name="pageNo" value="<%=pageNo %>" size="3" maxlength="3"/>

                页 / 共 <%=allPages %>

                <input type="submit" value="Go"/>

                 

            </form>

           

            <script type="text/javascript">

                function changePage(newPage) {

                    document.getElementById("pageNo").value = newPage;

                    document.getElementById("split_page").submit();

                }

               

                function checkPageNo() {

                    var pageNo = document.getElementById("pageNo").value;

                   

                    // js,使用  /^规则$/.test(内容)   来判断内容是否符合规则的要求.

                    // \d 表示是否为数字, + 表示前面的内容必须存在一个以上, 两个和到一起表示  数字要有1个以上,不能有其他内容.

                    // \w 表示字母数字或下划线

                    // ? 表示可以出现0次或1,但不能出现多次

                    // . 在正则表达式中表示任意字符  

                    // 比如:验证邮件地址的规则        \w+@\w+\.\w+  

                      

                    if (/^\d+$/.test(pageNo)) {

                        if (pageNo > 0 && pageNo <= <%=allPages%>) {

                            return true;

                        }

                    }

                    return false;

                }

               

            </script>

2) 下拉列表形式

               

                跳转到

                <select id="pageNo" name="pageNo" onchange="changePage(this.value);">

                    <%

                        for (int i = 1;i <= allPages;i++) {

                    %>

                    <option value="<%=i %>" <%=i==pageNo?"selected":"" %>><%=i %></option>

                    <%

                        }

                    %>

                </select>

                页 / 共 <%=allPages %>

               

3)数字形式

            <form action="news!list.action" method="post" id="split_page" onsubmit="return checkPageNo();">             

                <input type="button" value="<<" <%=pageNo==1?"disabled":"" %> οnclick="changePage(1);">

                <input type="button" value="<" <%=pageNo==1?"disabled":"" %> οnclick="changePage(<%=pageNo - 1 %>);">

               

                <%

                    if (pageNo - 2 > 1) {

                %>

                ...

                <%     

                    }

               

                    for (int i = pageNo - 2;i <= pageNo + 2 && i <= allPages;i++) {

                        if (i == pageNo) {

                %>

                    <font color='red'><%=i %></font>

                <%         

                        } else if (i > 0) {

                %>

                    <a href="javascript:changePage(<%=i %>);"><%=i %></a>

                       

                <%     

                        }

                    }

               

                    if (pageNo + 2 < allPages) {

                %>

                ...

                <%     

                    }

               

                %>

               

               

                <input type="button" value=">" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value=">>" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=allPages %>);">

                 

                <input type="hidden" name="pageNo" id="pageNo" value="<%=pageNo %>"/>

            </form>

 

 

再加入改变每页显示记录数的功能

                <%

                    int[] allSize = {1,2,5,10,20};

                %>

                每页显示

                <select id="pageSize" name="pageSize" onchange="changePage(1);">

                    <%

                        for (int i = 0 ;i < allSize.length;i++) {

                    %>

                    <option value="<%=allSize[i] %>" <%=allSize[i]==pageSize?"selected":"" %>><%=allSize[i] %></option>

                    <%     

                        }

                    %>

                </select>

                条数据

               

最后加入搜索功能

                <br/>

                <select name="column" id="column">

                    <option value="title">新闻标题</option>

                    <option value="content" ${column=="content"?"selected":""}>新闻内容</option>

                </select>

                <input type="text" name="keyword" value="${keyword}"/>

                <input type="button" value="搜索" onclick="changePage(1);"/>

               

为了方便使用,这种分页功能一般通过动态包含的形式实现,所以将所有的分页代码,单独写到一个jsp里。

通过动态包含里的<jsp:param>来传递参数。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%@ taglib uri="/struts-tags" prefix="s"%>

<%

    String path = request.getContextPath();

    String basePath = request.getScheme() + "://"

            + request.getServerName() + ":" + request.getServerPort()

            + path + "/";

%>

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

        <base href="<%=basePath%>">

 

        <title>My JSP 'index.jsp' starting page</title>

    </head>

 

    <body>

   

    <%--

        使用说明:

            将以下代码拷贝到需要显示分页内容的地方

           

            <jsp:include page="/split_page_plugin.jsp">

                <jsp:param value="${pageNo}" name="pageNo"/>

                <jsp:param value="${pageSize}" name="pageSize"/>

                <jsp:param value="${keyword}" name="keyword"/>

                <jsp:param value="${column}" name="column"/>

                <jsp:param value="${count}" name="count"/>

                <jsp:param value="news!list.action" name="URL"/>

                <jsp:param value="title:新闻标题|content:新闻内容" name="columnData"/>

                <jsp:param value="3" name="pageStyle"/>

            </jsp:include>

   

            参数说明:

                URL为查询列表的路径

                columnData是搜索选项的值,格式为: 字段名1:显示文字1|字段名2:显示文字2....

                pageStyle为页面显示风格, 1是数字型, 2是文本框,其他是下拉列表

   

     --%>

   

                    <br/>

            <%

                int pageNo = Integer.parseInt(request.getParameter("pageNo"));

                int pageSize = Integer.parseInt(request.getParameter("pageSize"));

                int count = Integer.parseInt(request.getParameter("count"));

               

                String column = request.getParameter("column");

                String keyword = request.getParameter("keyword");

               

                String URL = request.getParameter("URL");

               

                // 总页数

                int allPages = (count - 1) / pageSize + 1;

            %>

            <form action="<%=URL %>" method="post" id="split_page" onsubmit="return checkPageNo();">             

                <%

                    String pageStyle = request.getParameter("pageStyle");

                    if ("1".equals(pageStyle)) {

                %>

                <input type="button" value="<<" <%=pageNo==1?"disabled":"" %> οnclick="changePage(1);">

                <input type="button" value="<" <%=pageNo==1?"disabled":"" %> οnclick="changePage(<%=pageNo - 1 %>);">

               

                <%

                    if (pageNo - 2 > 1) {

                %>

                ...

                <%     

                    }

               

                    for (int i = pageNo - 2;i <= pageNo + 2 && i <= allPages;i++) {

                        if (i == pageNo) {

                %>

                    <font color='red'><%=i %></font>

                <%         

                        } else if (i > 0) {

                %>

                    <a href="javascript:changePage(<%=i %>);"><%=i %></a>

                       

                <%     

                        }

                    }

               

                    if (pageNo + 2 < allPages) {

                %>

                ...

                <%     

                    }

               

                %>

               

               

                <input type="button" value=">" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value=">>" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=allPages %>);">

                 

                <input type="hidden" name="pageNo" id="pageNo" value="<%=pageNo %>"/>

               

               

                <%     

                    } else if ("2".equals(pageStyle)) {

                %>

                <input type="button" value="首页" <%=pageNo==1?"disabled":"" %> onclick="changePage(1);">

                <input type="button" value="上一页" <%=pageNo==1?"disabled":"" %> onclick="changePage(<%=pageNo - 1 %>);">

                <input type="button" value="下一页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value="尾页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=allPages %>);">

               

                跳转到

                <input type="text" id="pageNo" name="pageNo" value="<%=pageNo %>" size="3" maxlength="3"/>

                页 / 共 <%=allPages %>

                <input type="submit" value="Go"/>

                <%     

                    } else {

                %>

                <input type="button" value="首页" <%=pageNo==1?"disabled":"" %> onclick="changePage(1);">

                <input type="button" value="上一页" <%=pageNo==1?"disabled":"" %> onclick="changePage(<%=pageNo - 1 %>);">

                <input type="button" value="下一页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=pageNo + 1 %>);">

                <input type="button" value="尾页" <%=pageNo==allPages?"disabled":"" %> onclick="changePage(<%=allPages %>);">

                               

                跳转到

                <select id="pageNo" name="pageNo" onchange="changePage(this.value);">

                    <%

                        for (int i = 1;i <= allPages;i++) {

                    %>

                    <option value="<%=i %>" <%=i==pageNo?"selected":"" %>><%=i %></option>

                    <%

                        }

                    %>

                </select>

                页 / 共 <%=allPages %>

               

               

                <%     

                    }

               

                %>

                <%

                    int[] allSize = {1,2,5,10,20};

                %>

                每页显示

                <select id="pageSize" name="pageSize" onchange="changePage(1);">

                    <%

                        for (int i = 0 ;i < allSize.length;i++) {

                    %>

                    <option value="<%=allSize[i] %>" <%=allSize[i]==pageSize?"selected":"" %>><%=allSize[i] %></option>

                    <%     

                        }

                    %>

                </select>

                条数据

                <br/>

                <select name="column" id="column">

                    <%

                        String columnData = request.getParameter("columnData");

                        String[] columnValues = columnData.split("\\|");

                        for (int i = 0;i < columnValues.length;i++) {

                            String[] values = columnValues[i].split(":");

                    %>

                    <option value="<%=values[0] %>" <%=values[0].equals(column)?"selected":"" %>><%=values[1]%></option>

                    <%

                        }

                    %>

                </select>

                <input type="text" name="keyword" value="<%=keyword %>"/>

                <input type="button" value="搜索" onclick="changePage(1);"/>

                 

            </form>

           

            <script type="text/javascript">

                function changePage(newPage) {

                    document.getElementById("pageNo").value = newPage;

                    document.getElementById("split_page").submit();

                }

               

                function checkPageNo() {

                    var pageNo = document.getElementById("pageNo").value;

                   

                    // js,使用  /^规则$/.test(内容)   来判断内容是否符合规则的要求.

                    // \d 表示是否为数字, + 表示前面的内容必须存在一个以上, 两个和到一起表示  数字要有1个以上,不能有其他内容.

                    // \w 表示字母数字或下划线

                    // ? 表示可以出现0次或1,但不能出现多次

                    // . 在正则表达式中表示任意字符  

                    // 比如:验证邮件地址的规则        \w+@\w+\.\w+  

                      

                    if (/^\d+$/.test(pageNo)) {

                        if (pageNo > 0 && pageNo <= <%=allPages%>) {

                            return true;

                        }

                    }

                    return false;

                }

               

            </script>

    </body>

</html>

 

 

点超连接,完成删除操作,因此要加入一个删除的连接路径。

<a href="news!delete.action?news.id=${news.id}" onclick="return window.confirm('确定要删除吗?');">删除</a>                     

编写Action的操作

    public String delete() throws Exception {

        ServiceFactory.getINewsServiceInstance().delete(news.getId());

        message = "新闻删除成功";

        url = "news!list.action";

       

        return "forward";

    }

修改也需要加入超连接。

<a href="news!updatePre.action?news.id=${news.id}">修改</a>                    

完成Action中的查询操作。

    public String updatePre() throws Exception {

        news = ServiceFactory.getINewsServiceInstance().findById(

                news.getId());

 

        return "update";

    }

 

<result name="update">/pages/news/news_update.jsp</result>     

完成修改表单

        <center>

            <form action="news!update.action" method="post">

                新闻标题:<input type="text" name="news.title" value="${news.title }"/> <br/>

                新闻内容:<input type="text" name="news.content" value="${news.content }"/> <br/>

                新闻发布日期:<input type="text" name="news.pubDate" value="${news.pubDate }"/> <br/>

                <input type="hidden" name="news.id" value="${news.id }"/>

                <input type="submit" value="修改"/>

            </form>

        </center>

Action中实现修改操作

    public String update() throws Exception {

        ServiceFactory.getINewsServiceInstance().update(news);

        message = "新闻修改成功";

        url = "news!list.action";

       

        return "forward";

    }































这篇关于Struts2 + Hibernate完成单表新闻管理功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124012

相关文章

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开

css实现图片旋转功能

《css实现图片旋转功能》:本文主要介绍了四种CSS变换效果:图片旋转90度、水平翻转、垂直翻转,并附带了相应的代码示例,详细内容请阅读本文,希望能对你有所帮助... 一 css实现图片旋转90度.icon{ -moz-transform:rotate(-90deg); -webkit-transfo

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.