1. struts2核心包
commons-logging-1.0.4.jar struts2框架的日志包
freemarker-2.3.8.jar struts2的UI标签模板
ognl-2.6.11.jar 对象图导航语言包
struts2-core-2.0.11.jar struts框架的核心类库
xwork-2.0.4.jar xwork类库,struts2基于此构建
2.Struts2 Action特征
①struts2 action对象为每一个请求产生一个实例,因此没有线程安全问题;
②struts action不依赖于容器,允许action脱离web容器单独被测试。如果需要,struts2 action仍然可以访问初始的request和response;
③struts2支持通过拦截器堆栈为每一个action创建不同的生命周期。
3.Action的创建方式
①具有public String execute()方法的普通类
public class LoginAction { private String username; private String password; public String execute() { User u = new User(); u.setUsername(this.getUsername()); u.setPassword(this.getPassword()); UserDAO dao = new UserDAO(); if (dao.userLogin(u)) { return "login_success"; } else { return "login_failure"; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }对于这种方法,一个普通类中声明一个execute方法,上面的例子中,username和password需要声明getter和setter方法,当提交表单的时候,框架会实现LoginAction类,然后调用setter方法,给username和password参数赋值。
②实现Action接口
public class LoginAction2 implements Action { private String username; private String password; public String execute() { User u = new User(); u.setUsername(this.getUsername()); u.setPassword(this.getPassword()); UserDAO dao = new UserDAO(); if(dao.userLogin(u)){ return "login_success"; }else{ return "login_failure"; } } //username和password的getter和setter方法 }
这种方式与第一种方法类似。
③继承ActionSupport类(推荐)
public class LoginAction3 extends ActionSupport { private static final long serialVersionUID = 1L; private String username; private String password; public String execute() { User u = new User(); u.setUsername(this.getUsername()); u.setPassword(this.getPassword()); UserDAO dao = new UserDAO(); if(dao.userLogin(u)){ return "login_success"; }else{ return "login_failure"; } } //username和password的setter和getter方法 }这种方法是被推荐使用的,原因是ActionSupport类中实现了很多方法,需要的时候,我们只需要覆盖相应的方法。execute()方法默认返回success。
4.Action接收表单数据
①action类的属性接收用户输入
这种方法使用较多,特别是当form表单中参数较少的情况。上文中的username和password方法即为通过action类的属性接收表单数据。
②利用领域对象接收用户输入(推荐)
public class LoginAction2 implements Action { private User user;//不用初始化 public String execute() { UserDAO dao = new UserDAO(); if(dao.userLogin(user)){ return "login_success"; }else{ return "login_failure"; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }这种方法需要创建一个领域对象,上面的例子中是User类,声明时不需要初始化,但是需要提供User的getter和setter方法。
使用这种方法时,在jsp页面form表单中控件的name属性也需要做修改,需要添加域对象名称user:
用户名:<input type="text" name="user.username"/><br/> 密码:<input type="password" name="user.password"/>
在登录成功的jsp页面,如果拿到username和password,也需要添加域对象名称user:
欢迎用户:<s:property value="user.username" /><br/> 密码是:<s:property value="user.password" />而其它两种方法,则不需要加域对象名称user,那么写username和password。
③使用ModelDriven模式接收用户输入
public class LoginAction3 extends ActionSupport implements ModelDriven<User> { private static final long serialVersionUID = 1L; private User user = new User();//这里一定要初始化;无需写setter/getter方法 public String execute() { UserDAO dao = new UserDAO(); if(dao.userLogin(user)){ return "login_success"; }else{ return "login_failure"; } } public User getModel() { // TODO Auto-generated method stub return user; } }这种方法需要实现ModelDriven<T>接口,并实现getModel()方法,领域对象在声明的时候需要初始化。
5.Struts2主要配置文件及加载次序
由上到下,加载次序依次为:
struts-default.xml struts2的默认配置文件
struts-plugin.xml struts2框架的插件配置文件
struts.xml 主配置文件
default.properties 属性文件
web.xml
需要注意以下两点:
①如果在多个文件中配置了同一个struts2常量,则后一个文件中的配置的常量值会覆盖前面文件中配置的常量值
②推荐在struts.xml文件中配置struts2常量
6.中文乱码问题
在jsp页面中设置编码为utf-8,并且在struts.xml中配置<constantname="struts.i18n.encoding"value="utf-8"></constant>
7.struts.xml简单配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 常量配置 -->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<!-- 父包 -->
<package name="default" namespace="" extends="struts-default">
<global-results>
<result name="login_success">/login_success.jsp</result>
<result name="login_failure">/login_failure.jsp</result>
</global-results>
<action name="exit">
<!-- <result>/login.jsp</result>效果等同于<result name="success" type="redirect">/login.jsp</result> -->
<result>/login.jsp</result>
</action>
</package>
<package name="user" namespace="/user" extends="default"> <!-- 继承自default包 -->
<default-action-ref name="index" />
<action name="login" class="net.nw.action.LoginAction3"></action>
</package>
<package name="admin" namespace="/admin" extends="struts-default">
<default-action-ref name="index" />
<action name="login" class="net.nw.action.AdminAction">
<result>/adminLogin.jsp</result>
</action>
</package>
</struts>
上面的例子中,一个包的namespace为user,另一个是admin。当普通用户登录时有一种跳转方式,当管理员登录时,有另一中跳转方式,这个时候包名就有作用,用来控制不同的用户登录。
①管理员登录:
action="<%=path %>/admin/login.action"②普通用户登录:
action="<%=path %>/user/login.action"
8.简单验证
第一步,需要在继承了ActionSupport的类中将验证信息加入,类似于键值对:
this.addFieldError("login_error", "用户名或密码错误");第二步,在jsp页面中取得验证信息,将信息传到前台页面显示:
<s:fielderror value="login_error" theme="simple"/>
9.Tomcat超链接传参中文乱码
在tomcat的配置文件server.xml中,加入URIEncoding="UTF-8":
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
11.通配符
<action name="*_*" class="net.struts2.action.{1}Action" method="{2}"><result>/{1}_{2}_success.jsp</result></action>
<include file="helllo.xml">
①创建request,session,application这四个Map类型对象
②实现RequestAware,SessionAware,ApplicationAware接口
③创建传统的HttpServletRequest,HttpSession,ServletContext对象
④实现ServletRequestAware,ServletContextAware接口
实现接口的方式都是IOC方式,第二种方法与第四种方法的区别在于,第二种方法中request等的数据类型是Map,而第四种种,是传统的HttpServletRequest类型。
一般使用实现接口的方式,这样可以利用注入的方法。
14.Result类型
action默认的是dispatcher类型跳转;客户端跳转不能保存request里面的内容,而服务器端跳转可以;
①dispatcher 跳转到URL,服务器端跳转,通常是跳转到JSP页面
②redirect 重定向到URL,客户端跳转,通常是跳转到JSP页面
③chain 跳转到一个Action,服务器端跳转
④redirectAction 重定向到一个Action,客户端跳转