【问题标题】:How do I call a methods in an jsp file from a javabean?如何从 javabean 调用 jsp 文件中的方法?
【发布时间】:2015-10-11 12:12:41
【问题描述】:

我有一个 jsp 文件,其中包含一些链接到 xslt 样式表的 xml 数据。我有几个类,用户、用户、testJAXB 和 DiaryApplication。

我的问题是如何调用用户方法或类来代替在 joe@average.com 之类的 xml 标签之间键入字符串我希望能够做这样的事情

意味着我可以使用 scriplets 来调用数据而不是输入数据。我该怎么做。

/////////////下面是我的JSP文件。

<%@page contentType="Application/xml"%><?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="main.xsl"?>
<% String filePath = application.getRealPath("WEB-INF/users.xml"); %>
<jsp:useBean id="diaryApp" class="anypackage.DiaryApplication" scope="application">
    <jsp:setProperty name="diaryApp" property="filePath" value="<%=filePath%>"/>
</jsp:useBean>

<%   ??? ???? ???%>
<users>
    <user>
        <email>user</email>
        <username>average user</username>
        <password>blahblah</password>
    </user>
    <user>
        <email>joe@bloggs.com</email>
        <username>Joe Bloggs</username>
        <password>foobar</password>
    </user>
     <user>
        <email>Average@joehotmail.com</email>
        <username>joe average</username>
        <password>password</password>
    </user>
      <user>
        <email>user@email.com</email>
        <username>user</username>
        <password>password</password>
    </user>
</users>

/////// 下面是两个类 user 和 Users

package anypackage;

import java.util.*;
import java.io.Serializable;
import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "users")
public class Users implements Serializable {
    // The list of user elements does NOT have an extra wrapper element.
    // See the comment in the XML file, and compare to the bookshop example.
    @XmlElement(name = "user")
    private ArrayList<User> list = new ArrayList<User>();

    public ArrayList<User> getList() {
        return list;
    }
    public void addUser(User user) {
        list.add(user);
    }
    public void removeUser(User user) {
        list.remove(user);
    }
    public User login(String email, String password) {
        // For each user in the list...
        for (User user : list) {
            if (user.getEmail().equals(email) && user.getPassword().equals(password))
                return user; // Login correct. Return this user.
        }
        return null; // Login incorrect. Return null.
    }
}


package anypackage;

import java.io.Serializable;
import java.util.*;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlAccessorType(XmlAccessType.FIELD)
public class User implements Serializable{
    @XmlElement(name = "email")
    private String email;
    @XmlElement(name = "username")
    private String username;
    @XmlElement(name = "password")
    private String password;

public User() {
    super();
    // TODO Auto-generated constructor stub
}
public User(String email, String username, String password) {
    this.email = email;
    this.username = username;
    this.password = password;
}
public String getEmail() {
    return email;
}
public void setName(String email) {
    this.email = email;
}

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}

}

////// 下面是我的 DiaryApplication 类

package anypackage;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class DiaryApplication {
private String filePath;
private Users users;

public DiaryApplication(String filePath, Users users) {
    super();
    this.filePath = filePath;
    this.users = users;
}
public DiaryApplication() {
    super();
    // TODO Auto-generated constructor stub
}
@XmlElement
public String getFilePath() {
    return filePath;
}
@XmlElement
public void setFilePath(String filePath) throws JAXBException, IOException {
    this.filePath = filePath;
    // This is the file path given to us.
    // We should use it

    // Load the users from the XML file...
    JAXBContext jc = JAXBContext.newInstance(Users.class);
    Unmarshaller u = jc.createUnmarshaller();
    FileInputStream fin = new FileInputStream(filePath); // use the given file path
    users = (Users)u.unmarshal(fin); // This loads the "users" object
    fin.close();
}
@XmlElement
public Users getUsers() {
    return users;
}
public void setUsers(Users users) {
    this.users = users;
}
@XmlElement
public void saveUsers() throws JAXBException, IOException {
    JAXBContext jc = JAXBContext.newInstance(Users.class);
    Marshaller m = jc.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    FileOutputStream fout = new FileOutputStream(filePath);
    m.marshal(users, fout);
    fout.close();
}
}

///////////////下面是我的TestJAXB类

package anypackage;

import java.util.*;
import java.io.*;
import javax.xml.bind.*;

public class TestJAXB implements Serializable {
 public static void main(String[] args) throws Exception {
  Users users = new Users();
  users.addUser(new User("randomegue@askdm.com", "tervor", "blahblah", "male", "green"));
  users.addUser(new User("joe@bloggs.com", "Joe Bloggs", "foobar", "male", "yellow"));
  // Boilerplate code to convert objects to XML...
  JAXBContext jc = JAXBContext.newInstance(Users.class);
  Marshaller m = jc.createMarshaller();
  m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  m.marshal(users, System.out);
 }
}

【问题讨论】:

    标签: java xml jsp xslt


    【解决方案1】:

    在设计良好的 MVC 应用程序中,JSP 不应该调用业务逻辑(Java 类),而应该只接收要显示的值。 换句话说,它应该只知道呈现接收到的数据所必需的逻辑。

    顺便说一句,如果你想以这种方式进行,你可以这样做。

    要在 JSP 文件中使用 Java 方法,您必须:

    • 在文件开头导入您的课程,例如&lt;%@ page import="full.package.path.ClassName" %&gt;
    • 那么你可以直接在你的scriptlet中使用它的静态方法,例如&lt;% ClassName.staticMethod(params...) %&gt;
    • 如果您需要的方法不是静态的,您需要构造一个实例,然后使用该方法,例如&lt;% ClassName c = new ClassName(); c.staticMethod(params...) %&gt;

    希望对你有帮助

    【讨论】:

    • 不,没有,即使我显示了所有代码,您也确实无法按照我的要求进行操作......
    猜你喜欢
    • 2012-01-19
    • 2011-07-18
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多