从Servlet类传递请求参数至普通Java方法及会话变量调用需求
嘿,我来帮你搞定这两个Servlet相关的需求,咱们一步步拆解:
需求1:从Servlet类将请求参数传递至普通Java方法
其实这个很直接——你只需要把Servlet中拿到的请求对象(或者从请求中提取的具体参数)作为参数,传入普通Java方法就可以了。这样普通方法就能直接使用这些参数,不需要额外的复杂操作。
举个例子,我们可以把业务逻辑抽离到一个普通Java类中:
// 普通业务类 public class UserService { // 接收HttpServletRequest参数,直接从中获取需要的数据 public void setUserName(HttpServletRequest req) { HttpSession session = req.getSession(); session.setAttribute("globalPidValue", req.getUserPrincipal().getName()); } // 或者更灵活:直接接收提取后的参数,耦合度更低 public void setUserName(String userName, HttpSession session) { session.setAttribute("globalPidValue", userName); } }
然后在Servlet中调用这个普通类的方法:
public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { UserService userService = new UserService(); // 方式1:直接传递HttpServletRequest对象 userService.setUserName(req); // 方式2:先提取参数和session,再传递(推荐,降低耦合) String userName = req.getUserPrincipal().getName(); HttpSession session = req.getSession(); userService.setUserName(userName, session); } }
需求2:在普通Java方法中获取Servlet设置的会话变量
这里要先纠正一个误区:普通Java方法不能直接调用Servlet来获取会话变量。因为Servlet是由Web容器(比如Tomcat)管理的,只有在处理HTTP请求时,Servlet才会拥有有效的HttpServletRequest和HttpSession对象。普通Java类脱离了Web请求上下文,直接调用Servlet方法拿不到有效的session。
正确的做法是:在Servlet处理请求的过程中,把会话对象或者会话中的变量传递给普通Java方法。
场景1:传递整个HttpSession对象给普通方法
如果普通方法需要操作多个会话变量,可以直接把HttpSession传过去:
// 普通Java类 public class GameService { public void getGlobalVariable(HttpSession session) { String gameValue = (String) session.getAttribute("globalVarable"); // 在这里处理业务逻辑,比如打印或使用这个变量 System.out.println("获取到的会话变量:" + gameValue); } }
Servlet中的调用逻辑:
public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 先设置会话变量 HttpSession session = req.getSession(); session.setAttribute("globalVarable", "game"); // 调用普通Java方法,传入session GameService gameService = new GameService(); gameService.getGlobalVariable(session); } }
场景2:直接传递会话中的具体变量值
如果普通方法只需要特定的会话变量,可以直接把变量值传过去,进一步降低耦合:
// 普通Java类 public class GameService { public void processGameValue(String gameValue) { // 处理业务逻辑 System.out.println("处理游戏变量:" + gameValue); } }
Servlet中的调用逻辑:
public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); session.setAttribute("globalVarable", "game"); // 先从session中取出变量,再传递给普通方法 String gameValue = (String) session.getAttribute("globalVarable"); GameService gameService = new GameService(); gameService.processGameValue(gameValue); } }
总结一下:核心思路是让Servlet作为请求入口,把上下文对象(request、session)或具体参数传递给普通Java方法,而不是反过来让普通方法去调用Servlet拿数据——这不符合Web容器的工作机制哦。
内容的提问来源于stack exchange,提问作者user3145999
相关产品推荐
相关产品推荐

