发表于: 2018-03-13 23:40:08

1 721


一、今天完成的事情


1、学习了springmvc相关知识点


使用Spring MVC,配置DispatcherServlet是第一步。

DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。

DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。


<!-- 配置DispatcherServlet -->
<servlet>
 <servlet-name>SpringMVC</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <!--配置DispatcherServlet的一个初始化参数:配置springMVC配置文件的配置和名称-->
 <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:spring-mvc.xml</param-value>
 </init-param>
 <!--在web应用启动时立即加载servlet-->
 <load-on-startup>1</load-on-startup>
 <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
 <servlet-name>SpringMVC</servlet-name>
 <!-- 监听当前域的所有请求-->
 <url-pattern>/</url-pattern>
</servlet-mapping>

<load-on-startup>1</load-on-startup>是启动顺序,让这个Servlet随Servletp容器一起启动


 <url-pattern>/</url-pattern> 会拦截所有的请求,rest风格就需要拦截所有请求。


 <servlet-name>example</servlet-name>这个Servlet的名字是SpringMVC,可以有多个DispatcherServlet,是通过名字来区分的。每一个DispatcherServlet有自己的WebApplicationContext上下文对象。同时保存的ServletContext中和Request对象中


<param-value>**.xml</param-value>指明了配置文件的文件名,不使用默认配置文件名,而使用spring-mvc.xml配置文件。



<!-- 加载Spring容器配置 上下文监听器-->
<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

Spring会创建一个WebApplicationContext上下文,称为父上下文(父容器) ,保存在 ServletContext中。




DispatcherServlet是一个Servlet,可以同时配置多个,每个 DispatcherServlet有一个自己的上下文对象(WebApplicationContext),称为子上下文(子容器),子上下文可以访问父上下文中的内容,但父上下文不能访问子上下文中的内容。 Spring 并没有限制我们,必须使用父子上下文。我们可以自己决定如何使用。

一般都是这样使用的:

父上下文容器中保存数据源、服务层、DAO层、事务的Bean。

子上下文容器中保存Mvc相关的Action的Bean.

事务控制在服务层。

由于父上下文容器不能访问子上下文容器中内容,事务的Bean在父上下文容器中,无法访问子上下文容器中内容,就无法对子上下文容器中Action进行AOP(事务)。


spring-mvc.xml文件的一些配置理解

  <!-- 会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter两个Bean,
   这是Spring MVC为@Controller分发请求所必需的 使用该注解后的spring-mvc.xml:
    spring 可以自动去扫描 base-package下面的包或子包下面的Java文件,如果扫描到有Spring的相关
   注解的类,则把这些类注册为Spring的bean -->
   <mvc:annotation-driven/>
   <!-- 注解扫描包 -->
   <!--控制器的扫描必须在spring-mvc.xml中,否则web.xml中的DispatcherServlet拦截器将无法访问到相应的控制器-->
   <context:component-scan base-package="com.student.controller"/>

   <!--使用aspect注解的aop-->
   <aop:aspectj-autoproxy/>



   <!-- springMVC最常用的视图解析器-->
   <bean id="viewResolver"
         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
       <property name="prefix" value="/WEB-INF/views/"/>
       <property name="suffix" value=".jsp"/>
       <property name="order" value="10"/>
       <!--设置优先级,一般设为10最小,原因自己查-->
   </bean>


   <!-- 配置拦截器 -->
   <mvc:interceptors>
       <!-- 配置登陆拦截器 -->
       <mvc:interceptor>
           <!--拦截后台页面的请求-->
           <!--<mvc:mapping path="/**"/>-->
           <mvc:mapping path="/student/list"/>
           <mvc:mapping path="/talent/u"/>
           <bean class="com.student.interceptor.SpringMVCInterceptor"/>
       </mvc:interceptor>
   </mvc:interceptors>
</beans>

<context:component-scan/> 扫描指定的包中的类上的注解,常用的注解有:

@Controller 声明Action组件
@Service    声明Service组件    @Service("myMovieLister") 
@Repository 声明Dao组件
@Component   泛指组件, 当不好归类时. 
@RequestMapping("/menu")  请求映射
@Resource  用于注入,( j2ee提供的 ) 默认按名称装配,@Resource(name="beanName") 
@Autowired 用于注入,(srping提供的) 默认按类型装配 


<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案,具体作用如上注释



特别的,由于现在通常推崇使用rest风格的接口,所以一般会选择拦截所有的url,同时所有静态资源就一起被拦截了,为了能正常的访问到静态资源,我们必须增加一些配置

 比如激活Tomcat等的defaultServlet来处理静态文件

<!--  设置静态文件访问  -->
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
 <servlet-name>default</servlet-name>
 <url-pattern>*.css</url-pattern>
</servlet-mapping>


要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,性能应该比先让DispatcherServlet拦截后再让defaultServlet要好


使用不同的服务器要用不同的命名:

Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default"
Google App Engine 自带的 默认Servlet的名字 -- "_ah_default"
Resin 自带的 默认Servlet的名字 -- "resin-file"
WebLogic 自带的 默认Servlet的名字  -- "FileServlet"
WebSphere  自带的 默认Servlet的名字 -- "SimpleFileServlet





Spring为我们提供了:
org.springframework.web.servlet.HandlerInterceptor接口,

org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,
实现这个接口或继承此类,可以非常方便的实现自己的拦截器。
 
有以下三个方法:
 
Action之前执行:

public boolean preHandle(HttpServletRequest request,
                        HttpServletResponse response, Object handler) throws Exception

 
生成视图之前执行

public void postHandle(HttpServletRequest request,
                      HttpServletResponse response, Object handler,
                      ModelAndView modelAndView) throws Exception

 
最后执行,可用于释放资源

public void afterCompletion(HttpServletRequest request,
                           HttpServletResponse response, Object handler, Exception ex)
throws Exception


分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面) 
在preHandle中,可以进行编码、安全控制等处理; 
在postHandle中,有机会修改ModelAndView; 
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。 
参数中的Object handler是下一个拦截器。


重定向的作用:

可以通过redirect/forward:url方式转到另一个Action进行连续的处理。

可以通过redirect:url 防止表单重复提交 。



二、明天计划完成的事情


1、由于springMVC的相关知识点涉及struck2框架,我打算完成springmvc参数传递的学习,小课堂就讲讲参数传递机制,并做好小课堂ppt


2、完成小课堂的分享



三、遇到的问题


暂无



四、收获


如上所述


task6开始时间:2018.02.07

预计demo时间:2018.03.03



需要延期

预计延期时间:2018.03.08  


原因:找到压测的机器立马就能提交任务六,任务七刚进入状态暂时不想打断,总之抓紧时间




http://task.ptteng.com/zentao/project-task-488-unclosed.htm



返回列表 返回列表
评论

    分享到