Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp 将servlet转换为JSF_Jsp_Jsf_Servlets - Fatal编程技术网

Jsp 将servlet转换为JSF

Jsp 将servlet转换为JSF,jsp,jsf,servlets,Jsp,Jsf,Servlets,大家好,我被要求将一个旧的JavaEEWeb应用程序(JSP/Servlet,EJB,JPA)转换成一个现代的JSF应用程序,除了Servlet之外,我做得最多 当前servlet是: @WebServlet(name = "StudentServlet", urlPatterns = {"/StudentServlet"}) public class StudentServlet extends HttpServlet { @EJB private StudentDaoLoca

大家好,我被要求将一个旧的JavaEEWeb应用程序(JSP/Servlet,EJB,JPA)转换成一个现代的JSF应用程序,除了Servlet之外,我做得最多

当前servlet是:

@WebServlet(name = "StudentServlet", urlPatterns = {"/StudentServlet"})
public class StudentServlet extends HttpServlet {
    @EJB
    private StudentDaoLocal studentDao;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String action = request.getParameter("action");
        String studentIdStr = request.getParameter("studentId");
        int studentId=0;
        if(studentIdStr!=null && !studentIdStr.equals("")){
            studentId=Integer.parseInt(studentIdStr);    
        }
        String firstname = request.getParameter("firstname");
        String lastname = request.getParameter("lastname");
        String yearLevelStr = request.getParameter("yearLevel");
        int yearLevel=0;
        if(yearLevelStr!=null && !yearLevelStr.equals("")){
            yearLevel=Integer.parseInt(yearLevelStr);
        }
        Student student = new Student(studentId, firstname, lastname, yearLevel);

        if("Add".equalsIgnoreCase(action)){
            studentDao.addStudent(student);
        }else if("Edit".equalsIgnoreCase(action)){
            studentDao.editStudent(student);
        }else if("Delete".equalsIgnoreCase(action)){
            studentDao.deleteStudent(studentId);
        }else if("Search".equalsIgnoreCase(action)){
            student = studentDao.getStudent(studentId);
        }
        request.setAttribute("student", student);
        request.setAttribute("allStudents", studentDao.getAllStudents());
        request.getRequestDispatcher("studentinfo.jsp").forward(request, response);
    }
如何将其修改为JSFbean?我需要添加和删除哪些部分

该应用程序是一个向数据库添加学生详细信息的简单应用程序,它是jsut,因此我可以更好地了解数据库如何与jsf一起工作


谢谢

这种转变并不是那么容易。我假设你已经有了“基础设施”,因为这显然对一篇文章来说太多了。所谓基础设施,我指的是所有必要的库、正确配置的web.xml等等

下面的内容与您的servlet不完全相同,但它涵盖了基本内容,我将留给您来猜测如何进行编辑和搜索

学生
班级:

public class Student {
    private long studentId;
    private String firstName;
    private String lastName;
    // getters+setters
}
我们的转换servlet:

// this is how we make the bean known to JSF
@ManagedBean(name="studentBean")
@ViewScoped
public class StudentServlet implements Serializable {
    @EJB
    private StudentDaoLocal studentDao;

    // this object will be "automatically" filled with the values from our inputform on the xhtml page
    private Student student; // getter+setter

    // we have unique actions for everything... they are referenced from the xhtml page
    public String add() {
        // do your yearLevel logic here
        studentDao.addStudent(student);

        return "studentInfo.xhtml"; // forward to the next page
    }

    public String delete() {
        studentDao.deleteStudent(student.getStudentId());

        return "studentInfo.xhtml";
    }
}
我们需要一个用于bean的“GUI”的xthml页面,并将其称为“student.xhtml”


正如您所看到的,在servlet的服务方法中,所有的事情都在一个地方搞砸了:获取请求参数、转换、验证、执行逻辑和执行数据库操作。在JSF中,有专门的组件来执行以下任务:

  • 请求参数(
    request.getParameter(…)
    )的收集是由Facesservlet透明地完成的,因此您通常根本不需要处理它
  • 转换是通过将转换器类引入特定组件(
    @facescoverter
    )或使用标准组件来完成的
  • 通过将一个或多个验证器连接到特定组件(
    @FacesValidator
    )或使用标准验证器来执行验证
  • 执行逻辑是通过调用支持bean的方法来完成的:根据组件/情况,您可以附加操作方法、操作侦听器方法、值更改侦听器方法或ajax侦听器方法。在您的情况下,您得到了返回导航案例结果的action方法(
    public void action(String action)
  • 执行数据库操作由注入的服务(通常由
    @EJB
    类)管理,就像在servlet中执行一样
接下来,JSF提供了一组UI组件(如
),其状态绑定到一个模型,该模型又由具有已知生命周期的支持bean(如
@ManagedBean
)表示。JSF生命周期由六个阶段组成(这里我不详细介绍):

  • 恢复视图(从HTTP请求构建或恢复视图,包括JSF组件树)
  • 应用请求值(收集提交的请求参数,必要时转换它们的值,并在组件状态下本地存储它们)
  • 过程验证(根据定义的规则集验证组件值)
  • 更新模型值(更新组件绑定的模型值)
  • 调用应用程序(调用方法,包括action/action listener/value change listener/ajax listener方法)
  • 呈现响应(呈现HTML并在HTTP响应中发送)
所有这些阶段都可以链接到servlet处理的操作并进行分解。现在,我想对您的经典Servlet+JSP组合的JSF对应项添加一些评论

  • String action=request.getParameter(“action”)

    在JSF中,您不需要做任何事情来收集这些参数,因为此作业由Facesservlet透明地处理

  • studentId=Integer.parseInt(studentIdStr)

    在JSF中,转换(以字符串形式获取请求参数并将其转换为其他java类)由UI组件的指定转换器处理。JSF有一些内置的转换器(比如
    DateTimeConverter
    ),但是您可以通过实现接口来提供自己的转换器。您可以通过指定
    converter
    属性(如
    converter=“myConverter”
    ),通过嵌套
    标记(
    )或嵌套标准标记(如
    )将其附加到给定组件。值得知道的是,某些值将自动为您强制

  • if(studentistr!=null&!studentistr.equals(“”)等

    这可能是您声明创建响应需要一些请求参数的方式。在JSF中,您可以通过指定UI组件的
    required
    属性来实现这一点(如

  • if(“Add”.equalsIgnoreCase(action)){doThis();}else{doThat()}
    etc

    执行业务方法通常在绑定到命令组件(如
    )的操作方法(如
    publicstringaction()
    )中完成:
    。通常,每个命令按钮都有一个业务操作。action方法是JSF知道的托管bean中的一个方法,不过,您可以将具体操作传递给action方法(例如
    公共字符串操作(字符串操作)

  • studentDao.addStudent(student)

    数据库操作的处理方式与action方法相同:在注入的服务上调用必要的方法

  • Student-Student=新学生(studentId、firstname、lastname、yearLevel)

    通过指定UI输入组件的值绑定,您可以将提交的POParameters绑定到模型。因此,首先,您需要事先准备一个模型,以便在您的支持bean中有一个非空的
    学生
    ,然后将JSF组件绑定到模型值(如
    )。这一部分在中得到了完美的解释

  • request.getRequestDispatcher(“studentinfo.jsp”)。用于
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html">
    
    <h:head />
    <h:body>
    
        <h:form>
            <h:inputText value="#{studentBean.student.studentId}" />
            <h:inputText value="#{studentBean.student.firstName}" />
            <h:inputText value="#{studentBean.student.lastName}" />
            <h:commandButton value="Add" action="#{studentBean.add()}" />
            <h:commandButton value="Delete" action="#{studentBean.delete()}" />
        </h:form>
    
    </h:body>
    </html>