发表于: 2016-10-23 22:52:48

0 2307


今天完成的事情:学习web.xml中的配置的内容

遇到的问题:

关于controller中参数报空的问题还是没有解决

1.

Dynamic Web Module 3.0 requires Java 1.6 or newer.

这是因为当前的编译器java版本太低,请打开eclipse的preferences->java->compiler选择右边的Compiler 


compliance level:为1.6以上版本,修改后没有解决



2.

Java compiler level does not match the version of the installed Java project facet.

这里要求,compiance 的jdk版本和progect Facet 中一样


3.

One or more constraints have not been satisfied.

使用网上的办法在pom.xml增加节点报错,先挖个坑

和第一个问题一样,没有解决


4.

后台控制台输出Successfully completed request,前台一直报404


因为没有扫描到控制器所以没有找到资源

加上这个注释<mvc:annotation-driven/>

5.

springMvc在控制器任意方法的参数中使用model,HttpServletRequest报java.lang.NullPointerException

这是debug级别的日志

[DEBUG] 2016-10-23 19:48:01,702 


method:org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:993)

Could not complete request

[DEBUG] 2016-10-23 19:48:01,077 method:org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:362)

Publishing event in Root WebApplicationContext: ServletRequestHandledEvent: url=[/ITTest/user/add.do]; client=[0:0:0:0:0:0:0:1]; method=[POST]; servlet=[mvc-dispatcher]; session=[1wrbcwar6slgd14udrbx04b2jf]; user=[null]; time=[13ms]; status=[failed: java.lang.NullPointerException]


如果代码中只写return "error" 的确能跳转到error.jsp页面(因为没有用到为空的对象)

Successfully completed request

[DEBUG] 2016-10-23 19:59:32,076 


method:org.springframework.context.support.AbstractApplicationContext.publishEvent


(AbstractApplicationContext.java:362)

Publishing event in WebApplicationContext for namespace 'DispatcherServlet-servlet': 


ServletRequestHandledEvent: url=[/ITTest/user/add.do]; client=[0:0:0:0:0:0:0:1]; method=[POST]; 


servlet=[DispatcherServlet]; session=[1tjefsxjro4p1dco2m0cdhvw5]; user=[null]; time=[131ms]; status=[OK]


@RequestMapping(value="/add.do",method=RequestMethod.POST)

public String insert(HttpServletRequest request,Userinfo user){

if(user != null){

执行添加操作

}

//request.setAttribute("error", "请填写正确的信息");

return "error";

}


百度了也没有得到答案,我在想是不是我自己只使用了springMvc,没有配置spring导致的呢


然后与网上的配置文件进行对比,


这篇blog对web.xml中的每个节点解释的很详细

http://blog.csdn.net/guihaijinfen/article/details/8363839


首先是web.xml配置文件

1.web.xml学名叫部署描述符文件,是在Servlet规范中定义的,是web应用的配置文件


2.

<!DOCTYPE web-app PUBLIC

 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

 "http://Java.sun.com/dtd/web-app_2_3.dtd" >

这段代码指定文件类型定义(DTD),可以通过它检查XML文档的有效性。(不是必须的)


关于dtd

一下来自百度百科

文档类型定义(Document Type Definition)是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。

我自己的理解就是该web.xml的语法说明,


3.

<web-app></web-app>

这是描述符汇总的根元素,所有关于我们web程序的信息都写在这个节点内,而且最好按照dtd文件中规定的顺序写


,在老版本的Servlet中子元素必须按照dtd文件的顺序来写


4.

<display-name></display-name>

在以前的日报也提到过,我的理解就是我们发布的web应用的名字,可以在某些gui图形化工具中显示


5.

<context-param></context-param>

这是很关键的一个元素

这里涉及到加载web项目的过程


我们在发布web项目的时候,需要web容器,最一开始我接触到tomcat,免费而且支持一些javaee特性

然后接触到jetty,相比tomcat更加轻量,在不需要tomcat的高级特性时,使用jetty节省资源,配置简单,灵活。

老大在知乎的一篇文章中提到了resin,我没用过


Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比


较优良,resin自身采用JAVA语言开发。支持负载均衡


当然还有一些商用的web应用服务器,如jBoss‘


web容器在加载web应用的时候,首先会读取项目web.xml配置文件,其中两个节点非常关键

他们是<listener></listener>和<context-param></context-param>。

web容器会创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文。

关于ServletContext:ServletContext相当于一个背景对象。可以访问应用范围的初始化参数和属性,


<context-param></context-param>元素中的内容相当于web应用的背景,web容器将这个元素的内容转化为键值对,


存入ServletComtext

6

<listener></listener>

监听器

web容器创建<listener></listener>中的类实例,根据配置的class类路径<listener-class>来创建监听,在监听中


会有contextInitialized(ServletContextEvent args)初始化方法,启动Web应用时,系统调用Listener的该方法,


在这个方法中获得:

ServletContext application =ServletContextEvent.getServletContext();

context-param的值= application.getInitParameter("context-param的键");


关于监听器

http://www.cnblogs.com/CBDoctor/p/4232859.html

web监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext,HttpSession,ServletRequest等域对象


的创建、销毁、以及属性的变化等,可以在事件发生前、发生后进行一些处理。


按监听的对象划分,可以分为监听

ServletContext对象

HttpSession对象

ServletRequest对象


我发现自己只配置了log4j的监听器

没有配置ContextLoaderListener

http://blog.csdn.net/ysughw/article/details/8992322

ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。

也就是spring的配置文件,它只负责监听web容器启动和关闭的事件。


和RequestContextListener

RequestContextListener的作用是监听HTTP请求事件,

http://blog.csdn.net/nacey5201/article/details/8547772

http://blog.csdn.net/ethanq/article/details/7342948

这里涉及到了实例化Bean的五个作用域,这里不太明白,

1.Singleton作用域

2.Prototype作用域

3.Request作用域 

4.Session作用域 

5.global session作用域


加上了这两个配置文件重启项目依然报request为空。。。。




7.<filter></filter>过滤器

web容器会读取<filter></filter>,根据指定的类路径来实例化过滤器。

一般我们会在项目中使用CharacterEncodingFilter

他的作用就是转换编码格式

下面是他的一部分源码

@Override

protected void doFilterInternal(

        HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

        throws ServletException, IOException {

    if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {

        request.setCharacterEncoding(this.encoding);

        if (this.forceEncoding) {

            response.setCharacterEncoding(this.encoding);

        }

    }

    filterChain.doFilter(request, response);

}

不会造成编码错误的原因就是因为他先获取请求的编码格式,先获取请求的编码格式,然后将此格式赋值给响应的


编码格式,这样页面在解析的时候不会出现响应和页面编码格式不同的问题


8.

最后是servlet

在使用springMvc的时候我们会使用DispatcherServlet,

http://jinnianshilongnian.iteye.com/blog/1602617

这篇blog介绍的很详细





返回列表 返回列表
评论

    分享到