Java 使JSP声明无状态

Java 使JSP声明无状态,java,jsp,session,scope,Java,Jsp,Session,Scope,考虑以下jsp: <%! private String firstName = ""; private String lastName = ""; private String formatName(){ return lastName + ", " + firstName; } %> <% firstName = request.getParameter("FNAME"); lastName = request

考虑以下jsp:

<%!
    private String firstName = "";
    private String lastName = "";

    private String formatName(){
        return lastName + ", " + firstName;
    }
%>
<%
    firstName = request.getParameter("FNAME");
    lastName = request.getParameter("LNAME");
    String formattedName = formatName();
    out.print(formattedName);
%>


有没有办法使声明部分成为无状态的?也就是说,我希望firstName和lastName对于每个页面加载都是唯一的。我不关心性能或最佳实践,重构现在不是一个选项。我在找类似的东西。有什么建议吗?

如果您试图完成示例似乎想要完成的任务,那么您根本不需要实例变量。你可以这样写

<%!
    private String formatName(String firstName, String lastName){
        return lastName + ", " + firstName;
    }
%>
<%
    String formattedName = formatName(request.getParameter("FNAME"),
                                      request.getParameter("LNAME"));
    out.print(formattedName);
%>

pvg是100%正确的,不应该这样做,我可能不会使用这个解决方案,但是我提出了一个解决方案,允许移动方法,而不让它们接受新参数。让其他人知道以下是可能的,但不是最佳实践,这可能会很有用

<%!
    public class MyHandler
    {
        public HttpServletRequest objRequest = null;
        public HttpSession objSession = null;
        public HttpServletResponse objResponse = null;
        public JspWriter objOut = null;

        private String firstName = "";
        private String lastName = "";
        private String formatName(){
            return lastName + ", " + firstName;
        }
        public void go()
        {
            firstName = objRequest.getParameter("FNAME");
            lastName = objRequest.getParameter("LNAME");
            String formattedName = formatName();
            objOut.print(formattedName);            
        }
    }
%>
<%
    MyHandler myHandler = new MyHandler();
    myHandler.objRequest = request;
    myHandler.objSession = session;
    myHandler.objResponse = response;
    myHandler.objOut = out;
    myHandler.go();
%>


否,因为这正是声明的目的所在。如果希望在每次页面加载时都发生一些事情,请将其放在scriptlet部分。@pvg之所以这样做,首先是因为无法在scriptlet部分声明方法。在类似scriptlet的作用域中声明方法有语法吗?没有,因为声明在声明部分。在您给出的示例中,不清楚为什么不将变量声明为本地变量并将其作为参数传递给格式化程序。实例变量似乎完全多余。@pvg想象20个方法都引用类变量“firstName”和“lastName”。现有的scriptlet代码期望类变量已经存在。我提出的解决方案是将大部分内容移动到.java中,并将请求、响应、会话等传递给类。基本上,每次加载页面时,我都需要一个新的实例来描述声明标记中的内容。Intellij IDEA可以为您简单地重构它。这里的问题是servlet的生命周期(JSP页面是什么)。这是一个无状态实例,可以被大量重用。这可能会帮助其他人,但与我的具体问题无关。我试图避免将所有现有方法重构为接受参数。好吧,我想你的具体问题还不清楚。您有一堆错误编写的JSP,希望通过以下方式修复它。。。没有修好它?不管答案是什么,这几乎肯定不会帮助任何人。