?在Maven中定义依赖于Oracle
<scope>主要管理依赖的部署。目前<scope>可以使用5个值:
compile,缺省值,适用于所有阶段,会随着项目一起发布
provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<scope>runtime</scope>
</dependency>
test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>6.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ojdbc6.jar</systemPath>
</dependency>
POM文件里面可以引用一些内置属性(Maven预定义可以直接使用)
${basedir} 项目根目录
${version}表示项目版本;
${project.basedir}同${basedir};
${project.version}表示项目版本,与${version}相同;
${project.build.directory} 构建目录,缺省为target
${project.build.sourceEncoding}表示主源码的编码格式;
${project.build.sourceDirectory}表示主源码路径;
${project.build.finalName}表示输出文件名称;
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
Struts2实现了MVC模式:
Model:Action接口/ActionSupport类 (业务控制器)多实例单线程
View:Struts2提供了4种视图技术 jsp freemarker velocity xslt,同时提供了Result接口,允许用户自定义扩展
Controller:一组拦截器和前端控制器StrutsPrepareAndExecuteFilter
配置前端控制器web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.devMode</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Struts2的常量配置
default.properties struts-default.xml struts-plugins.xml[插件配置] struts.xml struts.properties web.xml
struts.xml中的常量配置方法:
<constant name="struts.action.extension" value="action" />
抽象包 --只能被继承使用
<package name="default" extends="struts-default" abstract="true"></package>
Action的定义方法:
1、不实现任何接口,不继承任何类
2、Action接口(5大常量和execute方法)
3、ActionSupport
Action的配置:
<action name="hello" class="com.yan.action.HelloAction"></action>
使用hello.action访问HelloAction中的execute方法
<action name="hello" class="com.yan.action.HelloAction" method="show"></action>
使用hello.action访问HelloAction中的show方法
Action的编程:
将一个类对象相关的CRUD方法定义在一个Action类中
public class MyAction{
public String add()throws Exception{}
public String del()throws Exception{}
public String load()throws Exception{}
......
}
<action name="user_*" class="com.yan.MyAction" method="{1}">
user_add.action访问MyAction类中的add方法
<action name="*_*" class="com.yan.{1}Action" method="{2}">
User_add.action访问com.yan.UserAction类中的add方法
特例:<action name="*">如果不定义<action>的class属性,则默认ActionSupport类
<result>/{1}.jsp
实现了hello.action直接访问/hello.jsp页面,不需要额外定义对应的Action类
ActionSupport提供了服务器端数据校验的支持,可以通过编码实现服务器端数据校验
如果Action类中有一个方法public String add()throws Exception,则对应的服务器端数据校验方法为
public void validateAdd(){}。校验方法名称规则为"validate"+方法名,注意方法名首字母大写
执行流程:当客户提交数据时,首先框架自动化构建对应的Action对象(反射),然后框架的拦截器负
责接收用户提交数据,并通过set方法将参数注入到Action对象中,然后调用validateXXX方法实现服务器端
数据校验,然后如果有validate方法则继续执行validate方法;以上方法中如果调用this.addFieldError添
加了报错信息,则自动跳转到<result name=input>对应的页面;如果没有添加任何报错信息,则执行对应的
方法xxx或者execute
Action如何接收请求参数:
1、属性驱动
2、模型驱动
3、对象驱动OGNL <input name="user.username"/>
Action中如何使用Servlet Api
1、ActionContext --Map
2、ServletActionContext ---API
3、实现xxxAware接口
(Map API)
Action中添加报错信息的方法
addActionError("报错信息")
<s:actionerror/>
addFieldError("输入域名称","报错信息")
<s:fielderror/>显示所有输入域相关的报错信息
<s:fielderror name="username"/>显示<input name="username"/>对应的报错信息