我开发了一个非常大的Web应用程序。如果我需要在JSP页面中进行任何更改,则需要花费太多时间来查找JSP页面,链接,操作等。
那么,是否有任何工具或有任何技术可以直接获取特定JSP页面的代码?
我认为“查看来源”是不同的。它只显示该JSP的来源?
答案 0 :(得分:4)
您是否尝试过 NetBeans 或 Eclipse 或 MyEclipse 或任何其他 IDE ? 您可以使用此工具的快捷方式在应用程序中查找适当的代码。 它们可以帮助您更快地在应用程序中查找JSP页面。
答案 1 :(得分:3)
技术 - 您可以使用适当的设计模式来对代码进行分段,使每个jsp页面代表“动作”,例如: addFriendAction.jsp。这里的优点是找到合适的页面名称会更容易,因为您只需要引用相应的操作。将此与JSP页面进行比较,在JSP页面中将多个操作合并到同一页面中。下面是一个例子(我假设您正在根据MVC模式使用servlet和jsp页面)。例如使用命令模式将Web应用程序构建为操作(请参阅代码示例4.8- http://java.sun.com/blueprints/guidelines/designing_enterprise_applications_2e/web-tier/web-tier5.html)
添加到上面,让我分享我最近使用这种模式的项目。下面是我的servlet类
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package servlets;
import beans.SeekerCustomer;
import java.io.*;
import java.util.HashMap;
import javax.servlet.*;
import javax.servlet.http.*;
/**
*
* @author Dhruv
*/
//servlet class acts as controller by delegating
//operations to the respective Action concrete subclass
public class ControllerServlet extends HttpServlet {
//stores all the possible operation names
//and operation objects for quick access
private HashMap actions;
@Override
public void init() throws ServletException {
actions = new HashMap();
//all the various operations are stored in the hashmap
CreateUserAction cua = new CreateUserAction(new SeekerCustomer());
actions.put(cua.getName(), cua);
ValidateUserAction vua = new ValidateUserAction(new SeekerCustomer());
actions.put(vua.getName(), vua);
ListNonFriendsAction lnfa = new ListNonFriendsAction(new SeekerCustomer());
actions.put(lnfa.getName(), lnfa);
AddFriendAction afa = new AddFriendAction(new SeekerCustomer());
actions.put(afa.getName(), afa);
ConfirmFriendReqAction cfra = new ConfirmFriendReqAction(new SeekerCustomer());
actions.put(cfra.getName(),cfra);
DeclineFriendReqAction dfra = new DeclineFriendReqAction(new SeekerCustomer());
actions.put(dfra.getName(),dfra);
AddImageAction aia = new AddImageAction(new SeekerCustomer());
actions.put(aia.getName(),aia);
ViewImageAction via = new ViewImageAction(new SeekerCustomer());
actions.put(via.getName(),via);
ViewAllImagesAction vaia = new ViewAllImagesAction(new SeekerCustomer());
actions.put(vaia.getName(),vaia);
AddTagAction ata = new AddTagAction(new SeekerCustomer());
actions.put(ata.getName(),ata);
ViewTagAction vta = new ViewTagAction(new SeekerCustomer());
actions.put(vta.getName(),vta);
ViewAllTagsAction vata = new ViewAllTagsAction(new SeekerCustomer());
actions.put(vata.getName(),vata);
ViewProfileAction vpa = new ViewProfileAction(new SeekerCustomer());
actions.put(vpa.getName(),vpa);
EditAccountAction epa = new EditAccountAction(new SeekerCustomer());
actions.put(epa.getName(),epa);
ViewOthersImageAction voia = new ViewOthersImageAction(new SeekerCustomer());
actions.put(voia.getName(), voia);
AddOthersTagAction aota = new AddOthersTagAction(new SeekerCustomer());
actions.put(aota.getName(),aota);
LogoutAction loa = new LogoutAction(new SeekerCustomer());
actions.put(loa.getName(), loa);
ToptagsAction tts = new ToptagsAction(new SeekerCustomer());
actions.put(tts.getName(), tts);
UpdateAccountAction uaa = new UpdateAccountAction(new SeekerCustomer());
actions.put(uaa.getName(), uaa);
ViewAllFriendsAction vafa = new ViewAllFriendsAction(new SeekerCustomer());
actions.put(vafa.getName(), vafa);
ReturnHomeAction rha = new ReturnHomeAction(new SeekerCustomer());
actions.put(rha.getName(),rha);
}
public void processRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
//identify the operation from the URL
String op = getOperation(req.getRequestURL());
//find and execute corresponding Action
Action action = (Action)actions.get(op);
Object result = null;
try {
//maintain the session between requests
result = action.perform(req, resp);
HttpSession session = req.getSession();
session.setAttribute("session1", result);
} catch (NullPointerException npx) {
//nothing to handle
}
}
//both GET and POST operations are directed to "processRequest" method
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
//uses the URL to identify the operation
private String getOperation(StringBuffer requestURL) {
String op="";
//identifies the last index of "/" before ".do" and
//uses that to put each character after the "/" into "op"
for(int i= requestURL.lastIndexOf("/",requestURL.indexOf(".do"))+1; i<requestURL.indexOf(".do"); i++)
{
op= op+requestURL.charAt(i);
}
return op;
}
}
您可以看到每个操作都是在主servlet中通过将其分派给较小的servlet来处理的。 因此,如果单击CreateUserAction,则此操作由CreateUserAction.java servlet处理,然后将该输出重定向到CreateUserAction.jsp。这样,使用适当的模式会对代码进行分段,从而可以轻松地查找相应的JSP页面。这就是我试图在这里使用的模式 - 使用模式!
模板 - 您可以跨页面使用JSP模板,这样您只需要修改模板以实现JSP页面的常见更改(参考http://java.sun.com/developer/technicalArticles/javaserverpages/jsp_templates/)
一种相当天真的方式是使用IDE快捷方式。
答案 2 :(得分:0)
生成HTML注释,将每个代码段的源代码直接生成到最终输出中,可能是为了响应“debug”类型的查询参数。然后用“视图源”来看眼代码,你应该能够很容易地找出它的来源。
将这些注释添加到您的代码中需要花费一些时间,但随着时间的推移,您可以随意修改。
答案 3 :(得分:0)
我认为这更倾向于编码标准和最佳实践。
答案 4 :(得分:0)