Struts 2入门
Struts 2及其优势
- Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点
- Struts 2拥有更加广阔的前景,自身功能强大
Struts 2初体验
-
使用Struts 2开发程序的基本步骤
- 加载Struts 2类库
- 配置web.xml文件
- 开发视图层页面
- 开发控制层Action
- 配置struts.xml
- 部署、允许项目
-
加载Struts 2类库
文件名 说明 struts2-core-xxx.jar Struts 2框架的核心类库 xwork-core-xxx.jar XWork类库,Struts 2的构建基础 ognl-xxx.jar Struts 2使用的一种表达式语言类库 freemarker-xxx.jar Struts 2标签模块使用类库 javassist-xxx.GA.jar 对字节码进行处理 commons-fileupload-xxx.jar 文件上传是需要使用 commons-io-xxx.jar Java IO扩展 commons-lang-xxx.jar 包含了一下数据类型的工具类 -
配置web.xml
<filter> <filter-name>struts2 </filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter </filter-class> </filter> <!--将全部请求定位到指定的Struts 2过滤器中--> <filter-mapping> <filter-name>struts2 </filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
编写输出页面
... <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> ...
-
编写Action
public class HelloWorldAction implements Action { //用户输入的姓名,属性名与jsp中的name属性相同 private String name = ""; //向用户显示的信息 private String message = ""; public String execute() { //根据用户输入的姓名,进行"Hello,XXXX!"的封装 this.setMessage("Hello,"+this.getName()+"!"); //处理完毕,返回导航结果的逻辑名 return "success"; } //省略setter、getter 方法 }
-
配置Struts 2配置文件(struts.xml)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="web" extends="struts-default"> <action name="helloWord" class="cn.strutsdemo.HelloWorldAction"> <result name="success">helloWorld.jsp</result> </action> </package> </struts>
-
部署、运行项目
Struts 2再体验
-
数据验证
-
开发控制层
public class LoginAction implements Action{ private String userName = ""; private String password = ""; public String execute(){ if("jason".equals(username)&&"2010".equals(password)){ return "success"; }else{ return "error"; } } //省略setter、getter 方法 }
-
配置Struts 2配置文件(struts.xml)
<package name="default" namespace="/" extends="struts-default"> <action name="login" class="cn.strutsdemo.LoginAction"> <!--结果为“success”时,跳转至success.jsp页面--> <result name="success">success.jsp</result> <!--结果为“error”时,跳转至fail.jsp页面--> <result name="error">fail.jsp</result> </action> </package>
-
Struts 2访问Servlet API
-
Struts 2访问Servlet API的方式
-
与Servlet API解耦的访问方式
- 对Servlet API进行封装
- 提供了三个Map对象访问request、session、application作用域
- 通过ActionContext类获取这三个Map对象
- Object get(“request”)
- Map getSession()
- Map getApplication()
public class LoginAction implements Action{ private static final String CURRENT_uSER = "CURRENT_USER"; private String userName = ""; private String password = ""; public String execute(){ if("jason".equals(username)&&"2010".equals(password)){ //从ActionContext中获取session Map<String,Object> session = null; session = ActionContext.getContext().getSession(); if(session.containsKey(CURRENT_USER)){ session.remove(CURRENT_USER); } session.put(CURRENT_USER,username); return "success"; }else{ return "error"; } } //省略setter、getter 方法 }
页面显示
<body> <h1>读取Session中保存的用户名</h1> <div>欢迎您,$(sessionScope.CURRENT_USER)!</div> </body>
- 对Servlet API进行封装
-
与Servlet API耦合的访问方式
- 通过ServletActionContext类获取Servlet API对象
- ServletContext getServletContext()
- HttpServletResponse getResponse()
- HttpServletRequest getRequest()
- 通过request.getSession()获取session对象
- 通过xxx.setAttribute()和xxx.getAttribute()方法不同的页面或Action中传递数据
public class LoginAction implements Action{ private static final String CURRENT_uSER = "CURRENT_USER"; private String userName = ""; private String password = ""; public String execute(){ if("jason".equals(username)&&"2010".equals(password)){ //获取session HttpSession session = null; session = ServletActionContext.getRequest().getSession(); if(session.containsKey(CURRENT_USER) != null){ session.removeAttribute(CURRENT_USER); } session.setAttribute(CURRENT_USER,username); return "success"; }else{ return "error"; } } //省略setter、getter 方法 }
- 通过ServletActionContext类获取Servlet API对象
-
Struts 2的数据校验
-
Struts 2提供了数据验证机制
- 继承ActionSupport类来完成Action开发
- ActionSupport类不仅对Action接口进行简单实现,同时增加了验证,本地化等支持
-
修改LoginAction
public class LoginAction extends ActionSupport{ //......省略代码 public void validate(){ if(this.getUsername().length()==0){ addFieldError("name","用户名不能为空"); } if(this.getPassword().length()==0){ addFieldError("pwd","用户密码不能为空"); } } //......省略代码 }
Struts 2标签
Struts 2标签分为UI标签和通用标签
使用Struts 2标签需要在页面引入Struts 2的标签库
<%@ taglib prefix="s" uri="/struts-tags"%>
Struts 2 UI标签
-
常用表单标签
标签 说明 < s:form>…< /s:form> 表单标签 < s:textfield>…< /s:textfield> 文本输入框 < s:password>…< /s:password> 密码输入框 < s:textarea>…< /s:textarea> 文本域输入框 < s:radio>…< /s:radio> 单选按钮 < s:checkbox>…< /s:checkbox> 多选框 < s:submit/> 提交标签 < s:reset/> 重置标签 < s:hidden/> 隐藏域标签 -
常用非表单标签
标签 | 说明 |
---|---|
< s:actionerror/> | 显示Action错误 |
< s:actionmessage/> | 显示Action消息 |
< s:fielderror/> | 显示字段错误 |
修改jsp页面
<%@ taglib prefix="s" uri="/struts-tags"%>
...
<div>
<s:fielderror/>
</div>
<s:form action="/login.action">
<div>
用户名:<s:textfield name="userName"/>
</div>
<div>
密码:<s:password name="password"/>
</div>
<div>
<s:submit value="登录"/>
</div>
</s:form>
Struts 2通用标签
名称 | 标签 | 说明 |
---|---|---|
条件标签 | < s:if>…< /s:if> | 根据表达式的值, |
< s:elseif>…< /s:elseif> | 判断将要执行的内 | |
< s:else>…< /s:else> | 容 | |
迭代 | < s:iterator>…< /s:iterator> | 用于遍历集合 |
-
条件判断标签
<s:if test="表达式"> 需要执行的代码 </s:if> <s:elseif test="表达式"> 需要执行的代码 </s:elseif> <s:else> 需要执行的代码 </s:else>
-
迭代标签
<s:iterator value="集合对象" status="status" id="name"> 读取集合对象并输出显示 </s:iterator>
- value属性:需要进行遍历的集合对象
- status属性:当前迭代元素的IteratorStatus实例
- id属性:当前迭代元素的id,可直接访问元素,该参数可选