spring mvc3.2 请求及响应过程

doFilter-->doFilterInternal-->filterChain.doFilter-->HttpServlet service(request, response)-->doGet(req, resp)-->DispatcherServlet service(ServletRequest req, ServletResponse res)-->FrameworkServlet.processRequest-->doDispatch(request, response)-->DispatcherServlet.doDispatch调用实际action(HandlerAdapter,RequestMappingHandlerAdapter)-->RequestMappingHandlerAdapter.handle-->handleInternal
Resolver Handler Processor Discoverer resolve parameter provided Args


1,httpServlet
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
    {
String method = req.getMethod();


if (method.equals(METHOD_GET)) {
   long lastModified = getLastModified(req);
   if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
   } else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < (lastModified / 1000 * 1000)) {
   // If the servlet mod time is later, call doGet()
                    // Round down to the nearest second for a proper compare
                    // A ifModifiedSince of -1 will always be less
   maybeSetLastModified(resp, lastModified);
   doGet(req, resp);
} else {
   resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
   }


} else if (method.equals(METHOD_HEAD)) {
   long lastModified = getLastModified(req);
   maybeSetLastModified(resp, lastModified);
   doHead(req, resp);


} else if (method.equals(METHOD_POST)) {
   doPost(req, resp);
   
} else if (method.equals(METHOD_PUT)) {
   doPut(req, resp);
   
} else if (method.equals(METHOD_DELETE)) {
   doDelete(req, resp);
   
} else if (method.equals(METHOD_OPTIONS)) {
   doOptions(req,resp);
   
} else if (method.equals(METHOD_TRACE)) {
   doTrace(req,resp);
   
} else {
   //
   // Note that this means NO servlet supports whatever
   // method was requested, anywhere on this server.
   //


   String errMsg = lStrings.getString("http.method_not_implemented");
   Object[] errArgs = new Object[1];
   errArgs[0] = method;
   errMsg = MessageFormat.format(errMsg, errArgs);
   
   resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
    }
    




2,httpServlet
    private static final String METHOD_DELETE = "DELETE";
    private static final String METHOD_HEAD = "HEAD";
    private static final String METHOD_GET = "GET";
    private static final String METHOD_OPTIONS = "OPTIONS";
    private static final String METHOD_POST = "POST";
    private static final String METHOD_PUT = "PUT";
    private static final String METHOD_TRACE = "TRACE";
3,DispatcherServlet获取执行的action   public class DispatcherServlet extends FrameworkServlet
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}


先获取HandlerExecutionChain
接着获取HandlerInterceptor[] interceptors = mappedHandler.getInterceptors();  for (int i = 0; i < interceptors.length; i++)
紧接着// Actually invoke the handler  mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
获取请求参数HandlerMethodParameter通过PathVariableMethodArgumentResolver eg:NamedValueInfo含有path的contentId
然后:在方法invokeHandlerMethod中创建ModelAndViewContainer并通过request来updateModel
在InvocableHandlerMethod调用实际
处理后在HandlerMethodReturnValueHandlerComposite处理响应,得到响应类型处理类RequestResponseBodyMethodProcessor
然后处理/ Apply postHandle methods of registered interceptors.  --》for (int i = interceptors.length - 1; i >= 0; i--)
渲染数据render(mv, processedRequest, response); view.render(mv.getModelInternal(), request, response);rd.forward出去


如果不是反回json而是view eg:view/workdetail 通过ViewNameMethodReturnValueHandler设置到界面 model.put(bindingResultKey, dataBinder.getBindingResult());  model---> ModelMap   ModelAndView(ModelAndView: reference to view with name 'view/workdetail'; model is {playMovieDTO=com.zqgame.zqyy.dto.PlayMovieDTO@1f60390, careerMap={}, styles=科幻, styleId=1, currentDate=Fri Nov 14 10:09:14 CST 2014, org.springframework.validation.BindingResult.playMovieDTO=org.springframework.validation.BeanPropertyBindingResult: 0 errors})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 JDK配置: JDK是Java Development Kit的缩写,是Java开发的基础环境。JDK的配置包括安装和环境变量配置两个步骤。安装JDK可以从官网下载,配置环境变量需要将JDK的bin目录添加到系统的PATH环境变量中,以便在命令行中可以直接使用Java相关命令。 1.2 Tomcat 根目录: Tomcat是一个Web应用服务器,其根目录包含bin、conf、logs、webapps等目录。其中bin目录下有启动和停止Tomcat的工具,可以使用startup.sh或shutdown.sh启动和停止Tomcat。在Linux下,可以使用命令行启动和停止Tomcat。可以使用ps命令查看Tomcat进程是否在运行,也可以通过访问Tomcat的管理页面来查看是否活着。 配置server.xml中的端口号和IP可以通过修改server.xml文件来实现,其中Connector标签中的port属性控制Tomcat的端口号,address属性控制Tomcat监听的IP地址。 Tomcat的日志文件包括catalina.out、access.log等,作用是记录Tomcat的运行情况、访问日志等。catalina.xml包含了Tomcat的配置信息,可以进行一些高级配置。 如果8080端口被占用,可以查看Tomcat的日志文件,包括catalina.out和access.log,找到具体的错误信息并进行解决。 1.3 Maven作用: Maven是一个Java项目管理工具,可以帮助开发者自动化构建、测试和部署Java项目。Maven可以自动下载项目的依赖,管理项目的构建过程,生成项目的文档和报告等。Maven的配置文件是settings.xml,可以通过该文件修改Maven的一些配置信息,如代理服务器、本地仓库路径等。 1.4 数据库MySQL如何导出脚本: 可以使用MySQL自带的命令行工具mysqldump来导出脚本,执行命令:mysqldump -u username -p database_name > filename.sql,其中username是MySQL的用户名,database_name是要导出的数据库名称,filename.sql是导出的文件名。 Navicat初次连接报错显示乱码的解决办法是在Navicat中设置连接的字符集,选择UTF-8或者GBK等常用字符集即可。 2.1 导入Maven工程过程: 首先需要在IDE中打开Maven Projects视图,然后点击Import按钮,选择Existing Maven Projects,然后选择工程所在的文件夹,点击Finish即可导入Maven工程。 2.2 如何debug前台找后台: 可以通过在前台代码中打断点,然后使用浏览器访问前台页面,在断点处停下来,查看前台请求的URL和参数,然后在后台代码中打断点,查看后台代码执行的情况,以此来定位问题。 2.3 找一个喜欢的流程代码并解释清楚: 一个查询流程的代码示例: ```java // 创建一个DAO对象 UserDao userDao = new UserDaoImpl(); // 查询所有用户 List<User> userList = userDao.findAll(); // 遍历用户列表并输出每个用户的信息 for (User user : userList) { System.out.println(user); } ``` 该代码的主要功能是查询所有用户并输出每个用户的信息。首先创建一个DAO对象,然后调用findAll方法查询所有用户,返回一个User对象列表。然后遍历用户列表,输出每个用户的信息。 3.1 Spring AOP IOC 切面工程自己话解释六个注解: Spring AOP是Spring框架中的一个模块,用于实现面向切面编程。AOP的核心是切面(Aspect),切面由切点(Pointcut)和通知(Advice)组成。Spring AOP的IOC容器可以将切面对象自动注入到需要进行切面处理的对象中。常用的注解包括: - @Aspect:声明一个切面。 - @Pointcut:声明一个切点,用于匹配需要进行切面处理的方法。 - @Before:在目标方法执行之前执行通知。 - @After:在目标方法执行之后执行通知。 - @AfterReturning:在目标方法返回结果之后执行通知。 - @AfterThrowing:在目标方法抛出异常之后执行通知。 3.2 Spring MVC 3.2.1 Spring MVC常见注解作用: Spring MVCSpring框架中的一个模块,用于实现Web应用程序的开发。常见的注解包括: - @Controller:声明一个控制器。 - @RequestMapping:将请求映射到控制器方法上。 - @RequestParam:获取请求中的参数。 - @PathVariable:获取请求中的路径变量。 - @ResponseBody:将返回结果作为响应体返回。 - @ModelAttribute:将请求参数绑定到Model中。 3.2.2 DispatcherServlet流程: DispatcherServlet是Spring MVC的核心组件,用于处理所有的请求。其主要流程包括: - 接收请求:DispatcherServlet接收所有的请求。 - 处理请求:DispatcherServlet将请求分发给对应的控制器进行处理。 - 生成响应:控制器处理请求后生成响应结果,DispatcherServlet将其封装成一个ModelAndView对象。 - 渲染视图:DispatcherServlet将ModelAndView对象传递给ViewResolver进行视图解析,生成最终的响应结果。 3.3.1 Mybatis编码注意事项: Mybatis是一个数据访问框架,使用SQL语句进行数据库操作。在使用Mybatis时,需要注意以下几点: - SQL注入:需要对输入参数进行验证和过滤,防止SQL注入攻击。 - 映射文件位置:需要将映射文件放在正确的位置,且文件名必须与对应的DAO接口名称相同。 - SQL语句书写规范:需要按照规范书写SQL语句,避免出现语法错误。 - 数据库连接配置:需要正确配置数据库连接信息,包括数据库驱动、URL、用户名和密码等。 3.3.2 常用动态标签解释: Mybatis中常用的动态标签包括if、choose、when、otherwise、foreach等,用于在SQL语句中动态生成条件。if标签用于生成一个条件判断语句,choose标签用于生成一个多条件判断语句,foreach标签用于生成一个循环语句。 4.1 列举一个后台报错: 例如,后台代码中出现了空指针异常,可以通过查看日志文件中的错误信息定位到具体的代码行数,然后检查代码中可能出现空指针的地方,如变量是否为空等。如果是变量为空导致的错误,可以添加判空逻辑来避免该错误。 5. 总结: 本篇简答题主要涉及了Java Web开发中常用的环境配置、工具使用、框架和技术等方面的内容,包括JDK、Tomcat、Maven、MySQL、Spring AOP、Spring MVC、Mybatis等。通过学习本篇简答题,可以掌握Java Web开发中的基础知识和常用技术,为开发Web应用程序打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值