现在的位置: 首页 > 综合 > 正文

struts2.x学习笔记

2014年05月23日 ⁄ 综合 ⁄ 共 5889字 ⁄ 字号 评论关闭

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"

另一方面,包之间还有继承的关系。如上面的例子中,user包继承自default包,这时default包中的global-results和action都被user包继承。

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"/>

10.Default-action-ref
default-action-ref,是默认的action配置,当你的URL没有任何匹配的时候,struts就会找到这个默认的action

11.通配符

<action name="*_*" class="net.struts2.action.{1}Action" method="{2}"><result>/{1}_{2}_success.jsp</result></action>

12.包含模块
在struts.xml文件中包含其他xml文件:

<include file="helllo.xml">

13.Action访问web对象

①创建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,客户端跳转

抱歉!评论已关闭.