当前位置: 首页 > 知识库问答 >
问题:

视图不调用某些方法

辛渝
2023-03-14

我对JSF有一个非常奇怪的问题,但我不能自己解决它,因为没有错误消息我可以谷歌搜索。问题是,我有一个视图提交一个新的文章或更新一个现有的文章。

方法getArticle()返回-if?id=x是通过url设置的-id为x的文章POJO。否则,一个纯粹的空的新文章。根据设置的id,模式editArticle被设置为true或false。

<h:form id="idMasterForm" enctype="multipart/form-data">
    <h:panelGroup rendered="#{userController.loggedIn}">
            <h:panelGrid columns="2" cellpadding="5">
                <p:outputLabel for="title" value="Title" />
                <p:inputMask id="title"
                    value="#{editArticleController.article.title}" />
                <p:outputLabel for="author" value="Author" />
                <p:inputText id="author" value="#{userController.id}"
                    readonly="true" />
                <p:outputLabel for="date" value="Date" />
                <p:inputMask id="date"
                    value="#{editArticleController.article.date}" readonly="true" />
                <p:outputLabel for="link" value="File" />
                <p:selectOneMenu id="link"
                    value="#{editArticleController.article.link}">
                    <f:selectItems value="#{uploadFilesController.filesItems}" />
                </p:selectOneMenu>
                <p:outputLabel for="editor" value="" />
                <p:editor id="editor" widgetVar="editorWidget"
                    value="#{editArticleController.article.text}" width="600" />
            </h:panelGrid>

            <h:panelGrid columns="2" style="margin-top: 10px" rendered="#{!editArticleController.editArticle}">
                <p:commandButton value="Submit new article"
                    action="#{editArticleController.createArticle()}"
                    icon="ui-icon-disk" />
                <p:commandButton value="Clear" type="button"
                    onclick="PF('editorWidget').clear();" icon="ui-icon-close" />
            </h:panelGrid>

            <h:panelGrid columns="2" style="margin-top: 10px" rendered="#{editArticleController.editArticle}" >
                <p:commandButton value="Update article"
                    action="#{editArticleController.updateArticle()}"
                    icon="ui-icon-disk" />
                <p:commandButton value="Clear" type="button"
                    onclick="PF('editorWidget').clear();" icon="ui-icon-close" />
            </h:panelGrid>
            <h:outputText rendered="#{ ! userController.loggedIn}"
                value="#{res.globNotLoggedIn}" />
    </h:panelGroup>
</h:form>
import java.util.Date;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;

import hwr.Util;
import hwr.g2.model.Archive;
import hwr.g2.model.Article;
import hwr.g2.model.Author;
import hwr.user.UserController;

@ManagedBean
public class EditArticleController {
    private Article article;
    private Boolean editArticle;
    private Integer editArticleID;

    public EditArticleController() {
        this.article = new Article();
        System.out.println("EditArticleController was called");
    }

    public Article getArticle() {
        //System.out.println("getArticle() was called");
        if (this.getEditArticle()) {
            this.article = new Article(this.editArticleID);
        }
        return this.article;
    }

    public void setArticle(Integer articleID) {
        this.article = new Article(articleID);
    }

    public void setArticle(Article article) {
        System.out.println("setArticle(Article article) was called");
        this.article = article;
    }

    public void setText(String text) {
        this.article.setText(text);
    }

    public String getText() {
        return this.article.getText();
    }

    public void setTitle(String title) {
        this.article.setTitle(title);
    }

    public String getTitle() {
        return this.article.getTitle();
    }

    public Boolean getEditArticle() {
        // https://stackoverflow.com/questions/550448/get-request-and-session-parameters-and-attributes-from-jsf-pages

        HttpServletRequest req = (HttpServletRequest) FacesContext
                .getCurrentInstance().getExternalContext().getRequest();
        try {
            this.editArticleID = Integer.valueOf(req.getParameter("id"));
            if (this.editArticleID > 0) {
                this.setEditArticle(true);
            } else {
                this.setEditArticle(false);
            }
        } catch (Exception e) {
            this.setEditArticle(false);
        }
        return editArticle;
    }

    public void setEditArticle(Boolean editArticle) {
        this.editArticle = editArticle;
    }

    public Date getActualDate() {
        Date d = new Date();
        return d;
    }

    public void rangChanged() {
        // nothing
    }

    public String createArticle() {
        System.out.println("New Article...");
        Util util = new Util();
        UserController user = (UserController) util.getBean("userController");

        this.article.setAuthor(new Author(user.getId()));
        this.article.setDate(new Date());

        try {
            Archive archive = new Archive();
            archive.addArticle(this.article);
        } catch (Exception e) {
            System.out.println("something goes wrong here...");
            e.printStackTrace();
        }
        return "g2_home?faces-redirect=true";
    }

    public String updateArticle() {
        System.out.println("*** Update Article... ***");

        System.out.println("Debug: Update article, ID "
                + this.article.getId() + "! title: " + this.article.getTitle()
                + " and text: " + this.article.getText()
                + " and written by "
                + this.article.getAuthor().getFirst());

        try {
            Archive archive = new Archive();
            archive.updateArticle(this.article);
        } catch (Exception e) {
            System.out.println("something goes wrong here...");
            e.printStackTrace();
        }
        return "g2_home?faces-redirect=true";

    }
}

我使用了BalusC的检查表(在JSF中没有调用action方法),但没有找到什么。如果有人能给我指明正确的方向,那就太好了。顺便问一下,有没有更好的填写表格的方法?按照我的方式,getArticle()方法被视图调用了几次。

共有1个答案

季华茂
2023-03-14

我认为您应该定义托管bean作用域@ViewScoped或任何其他您想要的作用域。请看这个问题[question]:JSF2应用程序中默认的托管Bean作用域是什么?

 类似资料:
  • 嗨,我是一个新手在反应本机,并试图创建一个Android应用程序使用相同的。如果我改变我的观点- 上面的代码工作得很好,所有的组件都被渲染了,但是如果我改变样式并取消注释,和它的所有子元素都不被渲染。我不知道为什么会这样。我还尝试了其他风格在rowContainer像 只要style为空,它就可以工作,如果我在其中添加任何内容,视图就不会渲染。

  • 我试图用Javaflow(http://commons.apache.org/sandbox/commons-javaflow/)和OW2 ASM库(http://ASM.OW2.org/)来测试java类。我设置了javaagent并使用instrumentation.addTransformer()在加载时将我的transformer注册到instrument类。在transformer内部,

  • 问题内容: 我有在同一活动中多次动态添加的 自定义 。 每个自定义视图实例在其他东西旁边都有一个孩子。该有它的 ID ,它是同每个视图的实例。 对于每个自定义视图实例,我在创建活动时都设置了不同的内容。当我旋转屏幕时,将重新创建活动,但是现在每个活动都显示相同(文本与最后一个实例的文本相同)。 这是因为实例状态的保存和还原会自动保存一些信息,但是该信息显然与ID链接,在我的情况下会产生问题。 有没

  • 因此,我正在使用很棒的MPAndroid图表库来制作一个简单的LineChart。我能够使用GitHub上的示例项目大量定制它。 问题是,当我将它移到我自己的代码中时,某些方法不再能够解决: 特别是mlineChart.setExtraOffsets()和mlineChart.setAutoScaleminMaxEnabled()。可能还有其他的,但这是我注意到的仅有的两个。 不过,其他一切都很好

  • Android BottomNavigationView图标/文本菜单项不适合某些设备(共4项)。在nexus 5 emulator上,必须旋转才能显示所有项目。无论是从纵向视图还是横向视图开始,图标仅在设备旋转时显示(例如,请参见下面的图像) 我试过一些我可以测试的物理设备,它在所有这些设备上都能正常工作(无论大小),我相信根据测试仪,它对三星S7/8也不起作用,但无法证实这一点。 在肖像中打开

  • 我有两个h264视频文件。一个是“Big buck Bunny”,另一个是我使用FFMPEG创建的。两者在大多数浏览器中都可以播放,但在Firefox31.1.0中,“Big buck Bunny”播放得很好,但我的视频给出了“损坏视频”的响应。 ffprobe在屯门的两个视频的输出如下(首先是兔子,然后是我的) 谁能明白为什么我的不玩...?