文章目录

  • struts2基础
    • struts2处理步骤
    • 创建一个struts2项目
  • struts2进阶
    • struts2常量配置(struts.xml)
    • 实现action
      • pojo实现方式
      • action接口实现方式
      • 继承ActionSupport类
      • ActionContext 访问servletAPI
      • 访问servletapi
    • 配置Action(包括动态方法调用)
    • result
    • 异常(抛出异常的映射)
  • struts2标签库

struts2基础

struts2处理步骤

struts2处理步骤
1、客户端浏览器发送一个HTTP请求,例如,请求/somepage .action、/video/somevideo.mp4等;
2、web容器收到请求后,将请求传递给一个标准的ActionContextCleanUp过滤器来清除属性,不让后续的过滤器清除,从而延长Action中属性的生命周期,以便页面进行访问;
3、ActionContextCleanU批处理过后再经过其他过滤器,如SitMesh等,传递给核心控制器StrutsPrePareAndExecuteFilter;
4、StrutsPrePareAndExecuteFilter調用AcionMapper確定請求那個Action將控制器委派給ActionProxy代理
5、ActionProxy代理調用配置管理器ConfigurationManager从配置管理器ConfigurationManager从配置文件struts.xml中读取信息,创建ActionInvocation对象;
6、ActionInvocation在调用Action之前会一次调用所有配置拦截器脸,一旦Action执行结果返回字符串,ActionInvocation会根据该结果字符串查找对应的Result;
7、Result会调用视图模板如JSP、FreeMarker来显示,并在客户端HTTP相应之前,以相反的顺序执行拦截器链。
8、最后HTTP相应被返回给核心控制器StrutsPrepareAndExecuteFilter,一次经过web.xml中配置过滤器,发送给客户端。

创建一个struts2项目

1、配置StrutsPrepareAndExecuteFilter,就是web.xml配置过滤器
2、创建输入视图,index.jsp页面
3、创建业务与控制器,就是action连接
4、配置业务控制器struts.xml文件
5、创建结果视图,就是执行后返回的视图result.jsp或error.jsp

1、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"><display-name>chapter02</display-name><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><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

2、创建输入视图

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户记录</title>
</head>
<body><form action="user.action" method="post">用户名:<input type="text" name="userName"><br/>地址:<input type="text" name="address"><br/>电话:<input type="text" name="telephone"><br/>邮箱:<input type="text" name="email"><br/><input type="submit" name="" value="提交"></form>
</body>
</html>

3、创建业务控制器

package com.qst.chapter02.action;public class UserAction {//用户名private String userName;//地址private String address;//电话private String telephone;//邮箱private String email;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String execute() throws Exception{if(userName.length() > 0 & address.equals("青岛")){return "success";}else{return "error";}}
}

struts.xml文件没有配置,默认执行execute方法

4、配置业务控制器,struts.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN""http://struts.apache.org/dtds/struts-2.5.dtd"><struts><constant name="struts.devMode" value="true"/><!-- struts2的action都必须配置在package力 --><package name="default" namespace="/" extends="struts-default"><!-- 定义一个名为user的action,实现类 --><action name="user" class="com.qst.chapter02.action.UserAction"><result name="success">/result.jsp</result><result name="error">/error.jsp</result></action></package></struts>

5、创建结果视图
result.jsp和error.jsp
result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示用户信息</title>
</head>
<body>用户名:${param.userName}<br/>地址:${param.address}<br/>电话:${param.telephone}<br/>邮箱:${param.email}<br/></body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面</title>
</head>
<body>您输入的信息不符合要求,重新输入。
</body>
</html>

struts2进阶

struts2常量配置(struts.xml)

建议在struts.xml文件中配置相应属性

<struts><!-- 指定struts2是否使用开发模式,默认为false,开发阶段设置为true --><constant name="struts.devMode" value="true"/><constant name="struts.enable.DynamicMethodInvocation" value="true"/><!-- 指定web应用默认,Locale,默认en_US --><constant name="struts.locale" value="en_US"></constant><!-- 指定默认的web应用默认编码集,默认UTF-8 --><constant name="struts.il8n.encoding" value="UTF-8"></constant><!-- 处理multipart/form-data的MIME类型(文件上传)请求,默认jakarta,可以支持cos、pell和common-fileupload文件上传 --><constant name="struts.multipart.parser" value="jakarta"></constant><!-- 指定上传文件的临时保存了路径 --><constant name="struts.multipart.saveDir" value="javax.servlet.context.tempdir"></constant><!-- 指定上传文件的最大字节数 --><constant name="struts.multipart.maxSize" value="1024"></constant><!-- 指定将http请求映射指定的action映射器中,默认是org.apache.struts2.dispatcher.mapper.DefaultActionMapper --><constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.DefaultActionMapper"></constant><!-- 指定需要struts2处理的请求后缀,默认值是action,即所有与*.action匹配的请求都有struts2处理 --><constant name="struts.action.extension" value="action"></constant><!-- 默认ObjectFacotry Bean --><constant name="struts.objectFactory" value=""></constant><!-- 设置浏览器是否缓存静态内容,开发阶段通常设置为false --><constant name="struts.serve.static.browserCache" value="false"></constant><!-- 当struts.xml改变后,系统是否指定重新加载文件,默认为false,开发阶段为true --><constant name="struts.configuration.xml.reload" value="false"></constant><!-- 自定XSLT Result是否使用样式表缓存,开发阶段通常设置为true --><constant name="struts.xslt.nocache" value="true"></constant><!-- 指定struts2所需要的的国际化资源文件多个文件之间使用英文,隔开 --><constant name="struts.customer.il8n.resources" value=","></constant><!-- 指定struts2框架加载用户自定义敞亮文件,多个文件用英文","隔开 --><constant name="struts.customer.properties" value=","></constant>
</struts>

struts2包配置
1、修改namespace命名空间(/表示:应用路径/user.action-- 如果是/admin表示:应用路径/admin/user.action)
2、修改action name属性,相应的拦截的action
3、修改映射页面result中的相应页面

 <struts><constant name="struts.devMode" value="true"/><!-- struts2的action都必须配置在package力 --><package name="default" namespace="/" extends="struts-default"><!-- 定义一个名为user的action,实现类 --><action name="user" class="com.qst.chapter02.action.UserAction"><result name="success">/result.jsp</result><result name="error">/error.jsp</result></action></package></struts>

包含其他配置文件

<struts>
<include file="struts-part1.xml">
</struts>

实现action

pojo实现方式

普通的pojo类,通常还包含一个五参数的execute方法返回值为字符串

package com.qst.chapter03.action;public class LoginAction {private String userName;private String password;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;}public String execute(){System.out.println("用户名:"+userName);System.out.println("密码名"+password);if(userName.startsWith("qst")&&password.length()>=6){return "success";}else{return "error";}}}

action接口实现方式

继承ActionSupport类

validate()验证方法struts2框架自动返回inupt输入视图。

package com.qst.chapter03.action;import com.opensymphony.xwork2.ActionSupport;public class LoginAction3 extends ActionSupport{private String userName;private String password;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;}public String execute(){System.out.println("用户名:"+userName);System.out.println("密码名"+password);if(userName.startsWith("qst")&&password.length()>=6){return SUCCESS;}else{return ERROR;}}public void validate(){//简单验证用户输入//struts自动返回input接口if(this.userName == null || this.userName.equals("")){this.addFieldError("userName", "用户名不能为空!");System.out.println("用户名为空!");}if(this.password == null || this.password.length() < 6){this.addFieldError("password", "密码不能为空且长度不能小于6");System.out.println("密码不能为空且长度不能小于6");}}}

ActionContext 访问servletAPI

常用方法

方法 功能描述
Object get(Object key) 获取属性值,与HttpServletRequest的getAttribute(String name)方法类似
Map getApplication() 返回一个Map对象,该对象模拟web应用对应的ServletContext对象
static ActionContext getcONTEXT() 静态方法,用于获取系统的ActionContext对象
Map getParameters() 获取所有的请求参数,类似HttpServletRequest对象的getParameterMap()
Map GetSession 返回一个Map对象,该对象模拟HttpSession实例
void setApplication(Map application) 直接传入一个Map独享,该对象键值对转换成application的属性名和属性值
void setSession(Map session) 直接传入一个Map对象,该对象的Map对象里的键值对转换成session的属性名和属性值

例如

package com.qst.chapter03.action;import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class ClickNumAction extends ActionSupport{public String execute(){ActionContext ctx = ActionContext.getContext();Integer num = (Integer)ctx.getApplication().get("num");if(num==null){num=1;}else{num++;}ctx.getApplication().put("num", num);return SUCCESS;}}

该实例先试用actioncontext.getContext()静态方法获取系统的ActionContext对象,再调用ActionContext对象的getApplication方法获取ServletCotnext对象的Map对象。进行get和put操作。

访问servletapi

注意有三种接口访问不同对象

接口名 描述
ServletContextAware 实现该接口action直接访问web应用的ServletContext
ServletRequestAware 实现该接口的Action可以直接访问用户请求的HttpServletRequest实例
ServletResponseAware 实现该接口的Action可以直接访问服务器响应的HttpServletRespone实例

继承接口之后,要定义响应的属性
比如
private HttpServletRequest request;

继承servletRequestAware方法

package com.qst.chapter03.action;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionSupport;public class LoginAction4 extends ActionSupport implements ServletRequestAware{private String userName;private String password;private HttpServletRequest request;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;}@Overridepublic void setServletRequest(HttpServletRequest request) {// TODO Auto-generated method stubthis.request = request;}public String execute(){System.out.println("用户名:"+userName);System.out.println("密码名"+password);if(userName.startsWith("qst")&&password.length()>=6){HttpSession session = request.getSession();session.setAttribute("CurUser", userName);return SUCCESS;}else{return ERROR;}}public void validate(){if(this.userName == null || this.userName.equals("")){this.addFieldError("userName", "用户名不能为空");System.out.println("用户名为空!");}if(this.password == null || this.password.length() < 6){this.addFieldError("password", "密码不能为空且长度不能小于6");System.out.println("密码不能为空且长度不能小于6");}}}

配置Action(包括动态方法调用)

在struts.xml中配置相应的Action
package包组织action,在struts.xml中通过使用package中action配置action,需要指定action元素的name和class属性
name:指定actino名字,该action中处理url,比如,login表示该action的url为login.action
class:值action实现类。

result元素表示返回映射,比如在java文件返回值是return “success”
表示返回success映射。

<package name="default" namespace="/" extends="struts-default"><action name="login" class-"com.qst.chapter03.action.LoginAction"><result name="success">ok.jsp</result></action>
</package>

前面都是单个action对应一个类的方法execute,那么如何调用action里面不同方法?
动态方法调用
index.jsp

<a href="product!edit.action?productId=1000">编辑</a>
<a href="product!del.action?productId=1000">删除</a>

前提在productAction中有edit和del方法,struts.xml中配置了action name=“product”。

我们也可以使用通配符调用方法

<action name="*product" class="com.qst.chapter03.action.ProductAction" method="{1}"><result name="edit" type="dispatcher">/edit.jsp</result><result name="del">/del.jsp</result><allowed-methods>del,edit</allowed-methods></action>

访问直接使用

<a href="editproduct.action?productId=1000">编辑</a>
<a href="delproduct.action?productId=1000">删除</a>

result

局部result

<package name="test" extends="struts-default"><action name="login" class="com.qst.chapter03.action.LoginAction"><result name="success" type="dispatcher">/ok.jsp</result></action>
</package>

全局reuslt

<package name="test" extends="struts-default"><global-results><result>/ok.jsp</result></global-results<action name="login" class="com.qst.chapter03.action.LoginAction"></action>
</package>

result类型

结果类型 描述
dispatcher 应用于整合jsp技术
redirect 重定向其他url
redirectAction 重定向其他Action
chain 用于进行action链式处理
chart 用于整合JFreeChart技术
dispatcher 应用于整合jsp技术
freemarker 整合FreeMarker
httpheader 控制特殊http
jasper 整合jasperReport报表技术
jsf 整合JSF技术
stream 向浏览器返回inputStream,一般用于文件下载
tiles 整合Tiles
velocity 整合velocity
xslt 整合xml/XSLT技术
plainText 显示某个页面源代码

默认dispatcher技术。

异常(抛出异常的映射)

需要配置 两个属性exception和result属性
exception:用于指定action出现异常所映射的类型(java.lang.Exception)
result:指定转入action中的error或者中配置的元素

LoginAction5.java

package com.qst.chapter03.action;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.apache.struts2.interceptor.ServletRequestAware;import com.opensymphony.xwork2.ActionSupport;public class LoginAction5{private String userName;private String password;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;}public String execute(){System.out.println("用户名:"+userName);System.out.println("密码名"+password);if(userName.startsWith("qst")&&password.length()>=6){return "success";}else{throw new RuntimeException("用户登录失败!");}}}

struts.xml

<!-- 定义一个名为user的action,实现类 --><action name="login5" class="com.qst.chapter03.action.LoginAction5"><exception-mapping result="error" exception="java.lang.Exception"></exception-mapping><result name="success">/ok.jsp</result><result name="error">/error.jsp</result></action>

struts2标签库

struts2《轻量级框架应用与开发--S2SH》笔记相关推荐

  1. 《Java EE 轻量级框架应用与开发——S2SH》笔记

    嗯,那本书看完了,但是还没有整理完笔记,不太愿意在电脑旁太久,总会看到她,嗯,所以大部分时间在图书馆,只能刷这本书,哎,这些时日,大概是我一生中仅有的阴霾吧,我希望如此,不知道,希望早些赚钱,以此偿还 ...

  2. 轻量级框架和重量级框架的区别

    轻量级框架和重量级框架的区分并没有一个明确的定义,它是个相对概念,通常我们会依据启动资源多少.开发程度难易等进行区分. 一.从启动程序耗费资源来看,EJB(java bean),因为默认提供了EJB规 ...

  3. MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】

    Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...

  4. 实战 | 尝鲜 Svelte 前端框架,开发读书笔记

    提到前端开发框架,我相信大家第一时间想到的就是 Vue.React 和 Angular 三大主流.毕竟它们各个都是 GitHub 上 10w+ star 的知名项目,每个前端工程师至少要学习其中一个框 ...

  5. 尝鲜 Svelte 前端框架,开发读书笔记

    作者鱼皮 来源 | 鱼皮客栈(id:coder_yupi) 提到前端开发框架,我相信大家第一时间想到的就是 Vue.React 和 Angular 三大主流.毕竟它们各个都是 GitHub 上 10w ...

  6. Struts2 校验框架学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> truts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插 ...

  7. javaee互联网轻量级框架整合开发_企业开发:Spring框架的简易、高效切入篇

    原文:http://blog.csdn.net/qq_15096707/article/details/72819930作者:梦小白 介绍 Spring框架是个轻量级的Java EE框架.所谓轻量级, ...

  8. php consult用法,YanPHP: YanPHP——一个为API开发而设计的高性能轻量级框架

    YanPHP V0.2 Guide Documentation 这是一个为API开发而设计的高性能轻量级框架. 框架为你集成了一些常用的类库,让你开发更加便捷. 另外引入了Composer,可以让你更 ...

  9. ⑤ESP8266 开发学习笔记_By_GYC 【ESP8266 IDF框架 使用C++编程】

    ⑤ESP8266 开发学习笔记_By_GYC [ESP8266 IDF框架 使用C++编程] 目录 ⑤ESP8266 开发学习笔记_By_GYC [ESP8266 IDF框架 使用C++编程] 一.简 ...

最新文章

  1. cnil在python_在Python中使用cumprod()计算权益曲线
  2. linux 修改hostname
  3. 【渝粤教育】电大中专测量学 (2)作业 题库
  4. 【C++ STL】priority_queue自定义排序函数
  5. 百度吉利成立的汽车公司名称曝光,百度持股55%
  6. 4188元起!华为P40系列国行版发布:买它?
  7. python爬虫中for循环无法每一段输出_Python入门到掌握只需要这3大,4类,5大,6种,即可,附教程...
  8. hdu 3183 A Magic Lamp (rmq)
  9. nc(NetCat)命令
  10. mysql五:索引原理与慢查询优化
  11. php中文件读写总结,PHP读取文件_2014.5.26的总结
  12. 抖音快闪PPT制作教程
  13. 使用谷歌学术找到引用某篇英文论文的中文文献
  14. MoveIt! 学习笔记13 - KDL/IKFAST/TRAC-IK运动学求解器区别
  15. 解决swiper动态改变数据后分页混乱问题
  16. centos安装mysql5.7.19报 error while loading shared libraries: libaio.so.1
  17. matlab滤波实验,卡尔曼滤波实验及matlab实现
  18. 微信和支付宝付款码条码规则
  19. arduino 定时器、定时中断与PWM使用以及注意事项
  20. 科研必备工具篇(持续更新)

热门文章

  1. vue项目启动报错Cannot find module ‘xxx’
  2. 机器学习之决策树(Decision Tree)
  3. 车牌检测与识别:License plate detection and recognition (LPDR)
  4. 错过这次,再等一年!视频云CDN全线折扣Hi购启动...
  5. ffmpeg开发 av_init_packet()和av_new_packet()
  6. Hacker Fest: 2019-Walkthrough【VulnHub靶场】渗透测试实战系列3
  7. Idea编译出现[ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter这个问题
  8. contos7 安装Redis
  9. 【单双节锂电池6-8.4V升压9V,12V,24V快充PD升压系统解决方案】
  10. 洛谷p1307数字反转 c语言