这几天在做毕业设计,需要搭建项目,当第二次碰到的时候又忘记怎么解决的了,看之前的备注以及解决方法才想起来怎么弄,今天想把所出现的问题以及解决方法进行重新整理一下,如果有错误可以一起讨论讨论,哈哈~
- 创建web项目,没有web.xml导致pom.xml出现web.xml is missing and is set to true的错误
- jsp页面头部信息错误 The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
- maven依赖servlet-api和jsp-api的问题
- maven中json-lib库无法引入
- 如何修改maven项目名称
- 如何修改复制项目的根路径
一、创建web项目,没有web.xml导致pom.xml出现web.xml is missing and is set to true的错误
如果你是这样创建maven项目的:
解决方法是
如果你的maven项目在创建的时候已经是war项目了,那么解决方法是:
二、jsp页面头部信息错误 The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path
当创建一个jsp就会出现这个问题,原因是缺少tomcat
解决方法是:
2.1 方法1:
2.2方法2:
在pom.xml文件中加入:
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
<path>/income</path>
</configuration>
</plugin>
</plugins>
</build>
三、maven依赖servlet-api和jsp-api的问题
原代码:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
</dependency>
导致的错误是:
Java.lang.ClassCastException:
org.springframework.web.filter.CharacterEncodingFilter cannot be cast to javax.servlet.Filter
原因:
在运行的时候,容器会提供servlet-api和jsp-api这两个jar包,假如没有填写scope作用域,就会导致与tomcat中的servlet-api和jsp-api冲突,所以,这两个要加上scope为provide,使其能够在编译和测试阶段使用(为了能够让jsp编译通过)
解决方法:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
3.1 需要这servelt-api和jsp-api的原因:
1. 为了能够将jsp能够正确编译
2. jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类);jsp更擅长表现于页面显示,servlet更擅长于逻辑控制;Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到
3.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
3.2 Servlet的生命 周期:
第一个客户端的请求到达 Server
Server 调用 Servlet 的 init() 方法(可配置为 Server 创建 Servlet 实例时调用,在 web.xml 中 <servlet> 标签下配置 <load-on-startup> 标签,配置的值为整型,值越小 Servlet 的启动优先级越高)
一个客户端的请求到达 Server
Server 创建一个请求对象,处理客户端请求
Server 创建一个响应对象,响应客户端请求
Server 激活 Servlet 的 service() 方法,传递请求和响应对象作为参数
service() 方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息
service() 方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如 doGet() 或 doPost() 或程序员自己开发的新的方法。
对于更多的客户端请求,Server 创建新的请求和响应对象,仍然激活此 Servlet 的 service() 方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet 只初始化一次(只有一个对象),当 Server 不再需要 Servlet 时(一般当 Server 关闭时),Server 调用 Servlet 的 destroy() 方法。
3.3 这里讲解一下scope作用域:
1. compile(缺省值):compile表示被依赖项目参与当前项目的变异,包括测试,运行周期也参与其中,是一个**比较强的依赖**
2. provided:表示打包的时候可以不用包进去。事实上改以来理论上可以参与编译、测试、运行等周期。相当于compile,但是在打包阶段做了exclude,也就是说再运行的时候不会发布出去
(例如:
对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。
而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。换句话说,**它只影响到编译,测试阶段**。
在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,
而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包(例如tomcat已经提供了这个jar包在运行的时候)
,所以无需我们这个artifact对应的jar包了。
)
3. runtime,在**运行和测试**时使用,在编译阶段不使用,如JDBC驱动,适用运行和测试阶段
4. system:从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用
5. test,只在**测试**时使用,用于编译和运行测试代码。不会随项目发布。
四、maven中json-lib库无法引入
一开始是这样写的:
错误是:
解决方法及原因:
官网上面有两个文档:
所以是因为json-lib库有两个jdk版本的实现,json-lib-2.1-jdk13.jar和json-lib-2.1-jdk15.jar,需要加上描述符即可
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
五、如何修改maven项目名称
需要两步骤:
修改
六、如何修改复制项目的根路径