大家好我被要求将一个旧的Java EE Web应用程序(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);
}
如何将其修改为JSF bean?我需要添加和删除哪些部分
应用程序是一个简单的应用程序,可以将学生的详细信息添加到数据库中,这是一个很好的东西,所以我可以更好地理解数据库如何与jsf一起工作
感谢
答案 0 :(得分:5)
正如您所看到的,在您的servlet的服务方法中,所有这些都在一个地方混乱:获取请求参数,转换,验证,执行逻辑和执行数据库操作。在JSF中,有一些特殊组件可以执行以下任何任务:
request.getParameter(...)
)由Faces Servlet透明地完成,因此您通常不需要弄乱它; @FacesConverter
)或使用标准组件完成的; @FacesValidator
)或使用标准组件来执行验证; public void action(String action)
); @EJB
类)管理,就像在servlet中完成一样。接下来,JSF提供了一个UI组件集合(如<h:inputText>
),其状态绑定到一个模型,该模型又由具有已知生命周期的支持bean(如@ManagedBean
)表示。 JSF生命周期由六个阶段组成(我不会在此处详细介绍):
所有这些阶段都可以链接到servlet处理和分解的操作。我现在想补充一些关于你的经典Servlet + JSP组合的JSF对应的评论。
String action = request.getParameter("action");
等。
在JSF中,您不需要做任何事情来收集这些参数,因为这个作业由Faces Servlet透明地处理。
studentId=Integer.parseInt(studentIdStr);
等。
在JSF中,转换(将请求参数作为字符串获取并将其转换为其他java类)由UI组件的指定转换器处理。 JSF有一些内置转换器(如DateTimeConverter
),但您可以通过实现Converter
接口提供自己的转换器。您可以通过嵌套converter
标记(converter="myConverter"
或嵌套标准标记(例如{ {1}})。值得知道的是,某些值会自动为您强制执行。
<f:converter>
等。
这可能是你说明创建响应需要一些请求参数的方法。在JSF中,您可以通过指定UI组件的<f:converter converterId="myConverter" />
属性(如<f:convertDateTime ... />
)来完成此操作。
if(studentIdStr!=null && !studentIdStr.equals(""))
等。
执行业务方法通常在动作方法(如required
)中完成,这些方法绑定到命令组件(如<h:inputText required="true" />
):if("Add".equalsIgnoreCase(action)){ doThis(); } else { doThat() }
。最典型的是,每个命令按钮都有一个业务操作。 Action方法是JSF知道的托管bean中的方法,但您可以将具体操作传递给action方法(例如public String action()
与<h:commandButton>
)。
<h:commandButton action="#{yourBean.someAction}" />
等。
数据库操作在操作方法中以相同的方式处理:通过在注入的服务上调用必要的方法。
<h:commandButton action="#{yourBean.action('someAction)}" />
等。
通过指定UI输入组件的值绑定,将提交的参数绑定到模型。因此,首先要预先准备一个模型,以便在你的支持bean中有一个非null public String action(String action)
,然后将JSF组件绑定到模型值(如studentDao.addStudent(student)
)。这部分在noone's answer to this question。
Student student = new Student(studentId, firstname, lastname, yearLevel)
等。
动作方法可以返回一个String。此String是要转发到的导航案例结果(视图ID)。所以,这基本上等同于Student student
。此外,JSF在将bean与视图/请求/会话/应用程序关联时也会透明地处理<h:inputText value="#{studentBean.student.studentId}" />
。当然,您也可以随意绑定自己的其他对象。因此,JSF公开EL范围中的一些变量,并提供对对象(视图/请求/会话/应用程序)的访问,以将您的参数与。
答案 1 :(得分:3)
这种转变并不那么容易。我假设你已经有了“基础设施”,因为对于一个帖子来说这显然是太多了。基础结构我指的是所有必需的库,正确配置的web.xml等等。
以下内容与您的servlet不完全相同,但它涵盖了基础知识,我将让您猜测编辑和搜索的完成方式。
Student
类:
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”。
<?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>