大家好,我被要求将旧的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);
}
Run Code Online (Sandbox Code Playgroud)
如何将其修改为JSF bean?我需要添加和删除哪些部分
应用程序是一个简单的应用程序,可以将学生的详细信息添加到数据库中,这是一个很好的东西,所以我可以更好地理解数据库如何与jsf一起工作
谢谢
正如您所看到的,在您的servlet的服务方法中,所有这些都在一个地方混乱:获取请求参数,转换,验证,执行逻辑和执行数据库操作.在JSF中,有一些特殊组件可以执行以下任何任务:
request.getParameter(...)
)的集合由Faces Servlet透明地完成,因此您通常不需要弄乱它;@FacesConverter
)或使用标准组件来完成转换;@FacesValidator
)或使用标准组件来执行验证;public void action(String action)
)的动作方法;@EJB
类)管理,就像在servlet中完成一样.接下来,JSF提供了一组UI组件(如<h:inputText>
),其状态绑定到一个模型,该模型又由@ManagedBean
具有已知生命周期的支持bean(如)表示.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"
),嵌套<f:converter>
标记(<f:converter converterId="myConverter" />
或嵌套标准标记(如<f:convertDateTime ... />
))将其附加到给定组件.值得知道某些值将自动为您强制执行.
if(studentIdStr!=null && !studentIdStr.equals(""))
等等
这可能是您声明创建响应所需的一些请求参数的方式.在JSF中,您可以通过指定required
UI组件的属性(如<h:inputText required="true" />
)来实现.
if("Add".equalsIgnoreCase(action)){ doThis(); } else { doThat() }
等等
执行业务方法通常在public String action()
与命令组件(如<h:commandButton>
)绑定的操作方法(如)中完成:<h:commandButton action="#{yourBean.someAction}" />
.最典型的是,每个命令按钮都有一个业务操作.Action方法是一个托管bean中的一个方法,JSF知道,但是你可以将具体的动作传递给action方法(比如<h:commandButton action="#{yourBean.action('someAction)}" />
with public String action(String action)
).
studentDao.addStudent(student)
等等
数据库操作在操作方法中以相同的方式处理:通过在注入的服务上调用必要的方法.
Student student = new Student(studentId, firstname, lastname, yearLevel)
等等
通过指定UI输入组件的值绑定,将提交的参数绑定到模型.因此,首先要预先准备一个模型,以便在您的支持bean中获得非null Student student
,然后将JSF组件绑定到模型值(如<h:inputText value="#{studentBean.student.studentId}" />
).这个部分在没有人对这个问题的答案中得到了完美的解释.
request.getRequestDispatcher("studentinfo.jsp").forward(request, response);
等等
Action方法可以返回String.此String是要转发到的导航案例结果(视图ID).所以,这基本上相当于public void action() { ... return "studentinfo"; }
.此外,request.setAttribute("student", student)
当JSF将bean与视图/请求/会话/应用程序相关联时,JSF也会透明地处理它.当然,您也可以随意绑定自己的其他对象.因此,JSF在EL范围中公开了一些变量,并提供对对象(view/request/session/application)的访问,以便将参数与之关联起来.
归档时间: |
|
查看次数: |
1470 次 |
最近记录: |