P529
Build Path —— Add Library 是往Eclipse项目里添加库/jar。
其中用户库是可以自定义的,但是在复现P529过程中,创建User Library时,如果勾选了System Library(added to the boot class path):
则会生成一个后带系统库(system library)字样的User Library,运行项目会出错。
所以,不要勾选System Library(added to the boot class path)。
P19 Eclipse建立运行第一个最简单的Web程序
① 新建Dynamic Web Project,在项目的WebContent目录下,新建一个JSP文件,记住勾选Use JSP Template(默认选中)。
本例取名为first.jsp,代码如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
My first WebDemo!
</body>
</html>
② Tomcat上运行该项目,浏览器地址:
http://localhost:8080/projectName/jspName.jsp
projectName:项目名称
jspName.jsp:jsp文件名
本例的实际地址:
http://localhost:8080/firstWebDemo/first.jsp
结果:
注意:
① 一定要将jsp文件放对位置(WebContent下,而不是其子目录或者其他目录下),项目下的WebContent/WEB-INF目录下的文件为受保护文件,用浏览器地址(客户端)是无法访问的,只有服务端(如配置的action)可以访问。
② 有时莫名其妙就是报错,找不到文件,并不是URL路径或者上述步骤问题,如下(可以看到,浏览器和上面不同,是的,这是在另一台机器上复现时候的,用的Chrome)
解决:项目,服务器全部删除,重新Run as ——>....
另外,Eclipse下Dynamic Web Project目录结构:
其中,Java Resources内存放项目的java资源:
src存放用户自定义的java类
Libraries存放项目所需的Java库,为各种jar包
JavaScript Resources存放项目的javascript资源
//三个文件包各自作用?
build?
WebContent:
总的:
要注意的是,此文件目录只是Eclipse为了明晰项目开发架构自定义的,并不是标准的web应用原始的文件目录,原始的web项目文件组织可以在Tomcat的webapps的示例中看到:
而浏览器访问的是Tomcat发布的Web应用,只是从Eclipse的项目架构到标准的原始Web应用文件组织这一步由Eclipse完成了,其中,Eclipse将项目中的src目录下的所有资源放入新建的项目名/classes目录下(包括src下的各种配置文件),但是注意,Eclipse并不会主动把用户新增的jar(build path)放入WEB-INF/lib下,这也是经常会提到的,如果想要发布应用,则需要将用户库手动放入lib下的原因。
这也解释了直接访问jsp资源时URL的路径中没有WebContent,如上面访问first.jsp时没有加WebContent这一层目录,因为发布的应用中没有这一层目录。为了便于对比,将Eclipse下的项目testStruts和Tomcat发布的app文件目录对比一下即可:
Eclipse:
Tomcat:
对比发现,Tomcat发布的apps有如下的文件组织:
其中,classes文件夹即Eclipse的src文件夹,剩下的content,lib和web.xml仍然为Eclipse原有的的文件,注意到,JRE System Library即Java自带的运行库没有包含在项目中。另外,Eclipse中JRE System Library下方的Web App Libraries其实是WEB-INF/lib的副本,且会自动同步。但是为只读属性,没有权限修改。
2 使用Struts2 的Config Browser插件看struts2.xml配置的action映射关系
原料:下载的struts2-all的包步骤:将lib下的struts2-config-browser-plugin-版本号.jar复制黏贴进项目的WEB-INF的lib目录下(注意要使用同一版本的Struts的jar包)。
然后在服务器上运行项目,在浏览器地址栏输入地址:
http://ip:port/project/config-browser/actionNames.action
其中ip为本机ip,port为本项目在服务器上的发布端口,project为本项目名。如亲测的实例:
http://localhost:8080/jyh/config-browser/actionNames.action
结果如下:
注意,上图中有3个工作空间:
/config-browser
default
/
而不是两个工作空间,如改为第三个工作空间“/”时:![](https://img-blog.csdnimg.cn/20181102125118673.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1Byb0xheW1hbg==,size_16,color_FFFFFF,t_70)
BTW,namespace是在struts.xml中“定义”的,注意看下面的配置语句:
配置的结果:
定义namespace为“/”, 并且空——“”就是default,或者不进行配置也是default,可以配置为任意名字(符合规范的)。
web.xml中
通过配置ContextLoaderListener监听器,使容器启动时,自动加载applicationContext配置,
因为它实现了ServletContextListener这个接口,容器启动时会自动执行它实现的方法。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
默认情况下,会加载WEB-INF/applicationContext.xml这个文件,我们可以通过配置contextConfigLocation参数改变配置文件的路径
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
以上配置均在web.xml文件的<web-app></web-app>区域
这样可以将applicationContext.xml放入src文件夹下(因为发布即Tomcat上run时,会将src文件全部放入WEB-INF/classes/目录下)。
注意一个项目中只有一个applicationContext.xml,多了会引起先后加载,覆盖等等问题。(被坑过?)
http://www.cnblogs.com/S-E-P/archive/2012/01/18/2325253.html
这篇写的很好,action中使用将property类型声明为interface类型,setter中传入的变量类型也是interface类型,Spring配置文件(applicationContext.xml)中的ref的bean id对应的类才给出实现(注意实现类不是直接写在ref后面的!!被坑惨),这样避免实际类改变时,采用硬耦合(代码嵌入)方式带来的重构工作量,可以直接在配置文件改就好了。并且action类的由于不管interface的具体指向(虽然代码中对其操作仍然当做实现类对象来操作),所以不用引用interface实现类对应的包,只用引入interface的包即可。编程也变成了“勉强接口编程”。