一:什么是struts2?
Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点
Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性
二:struts2的项目结构
apps目录:Struts2示例应用程序
docs目录:Struts2指南、向导、API文档
lib目录:Struts 2的发行包及其依赖包
src目录:Struts 2项目源代码
步骤一:配置web.xml文件
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <!-- 拦截所有的action --> <url-pattern>/*</url-pattern> </filter-mapping>
步骤二:在src目录下创建struts2.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 配置文件中只要添加以下配置,那么以后修改配置文件不用重启tomcat --> <constant name="struts.devMode" value="true" /> <package name="default" namespace="/" extends="struts-default"> <!-- 第一个action的例子 --> <action name="helloWorld" class="cn.happy.action.HelloWorldAction"> <result name="success"> index.jsp </result> </action> <!-- 登陆的action --> </package> <!-- Add packages here --> </struts>
步骤三:编写Action类
package cn.happy.action; import com.opensymphony.xwork2.Action; public class HelloWorldAction implements Action{ private String name ; private String message; public String execute() throws Exception { setMessage("Hello"+getName()); return "success"; } }
步骤四:创建index.jsp页面
<div> <h1> <!--显示Struts Action中message的属性内容--> <s:property value="message"/> </h1> </div> <div> <form action="helloWorld.action" method="post"> 请输入您的姓名: <input name="name" type="text" /> <input type="submit" value="提交" /> </form> </div>
步骤五:使用浏览器访问
运行结果
案例二:
实现登陆案例
步骤一:在src目录下创建struts2.xml配置文件,如下:
<struts> <!-- 修改该文件,tomcat不用重启 --> <constant name="struts.devMode" value="true"/> <package name="default" namespace="/" extends="struts-default"> <action name="HelloWorldAction" class="cn.action.HelloWorldAction"> <result name="success">/success.jsp</result> <result name="login">/error.jsp</result> </action> </package> </struts>
步骤二:创建Action类
注意:在此需要校验从前台传递过来的用户名和密码,所以我们需要在Auction类中植入两个属性,但如果当属性过多时我们就可以将这些属性封装成为实体类,在Action类中引用它们。
1.1创建实体类UserInfo
package entity; public class UserInfo { private String username; private String userpwd; public String getUsername() { return username; } public String getUserpwd() { return userpwd; } public void setUsername(String username) { this.username = username; } public void setUserpwd(String userpwd) { this.userpwd = userpwd; } }
1.2
创建的Action类加多实现一个接口:ModelDriven<T>,并且重写该接口的抽象方法!
package cn.action; import java.util.Map; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ModelDriven; import entity.UserInfo; public class HelloWorldAction implements Action,ModelDriven<UserInfo> { private UserInfo users=new UserInfo(); @Override public String execute() throws Exception { /*Map<String, Object> session = ActionContext.getContext().getSession(); session.put("username", users.getUsername());*/ HttpSession session = ServletActionContext.getRequest().getSession(); session.setAttribute("username", users.getUsername()); if(users.getUsername().equals("admin")&&users.getUserpwd().equals("admin")) { return "success"; } else { return "login"; } } @Override public UserInfo getModel() { // TODO Auto-generated method stub return users; } }
步骤三:获取session
方式:耦合
解藕
1.1耦合方式:
方式一:
HttpSession session2 = ServletActionContext.getRequest().getSession()
方式二:
1.2解耦方式
方式一:
Map<String, Object> session = ActionContext.getContext().getSession();
返回值是一个Map集合,我们回想下当初我们学习servlet时,如何向session的作用域中存放数据?
request.getSession().setAttribute(string,Object);
怎么样,眼熟吧!不解释
方式二:
使用struts2提供的SessionAware接口为我们自动装配出来一个Map集合,使用同上!
那么问题来了?这两种方式有什么不同吗?
解耦方式:
为了避免与Servlet API耦合在一起,方便Action类做单元测试,
Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,
构造了三个Map对象来替代这三种对象,在Action中,
直接使用HttpServletRequest、HttpSession、ServletContext对应的Map对象来保存和读取数据。
要获得这三个Map对象,可以使用com.opensymphony.xwork2.ActionContext类
耦合方式:
直接访问 Servlet API将使Action类与Servlet API耦合在一起,Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,测试过程中就必须有Servlet容器,这样不便于Action类的测试,但有时候,确实需要访问这些对象,Struts2同样提供了直接访问ServletAPI对象的方式。
要直接获取Servlet API对象可以使用org.apache.struts2.ServletActionContext类,该类是ActionContext类的子类。
步骤三:创建登陆界面
<s:form name="form1" namespace="/" method="post" action="login"> 请输入用户名: <s:textfield name="username"></s:textfield> <br/> <s:textfield name="password"></s:textfield><br/> <s:submit value="登陆"></s:submit> </s:form>