struts2《轻量级框架应用与开发--S2SH》笔记
文章目录
- 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》笔记相关推荐
- 《Java EE 轻量级框架应用与开发——S2SH》笔记
嗯,那本书看完了,但是还没有整理完笔记,不太愿意在电脑旁太久,总会看到她,嗯,所以大部分时间在图书馆,只能刷这本书,哎,这些时日,大概是我一生中仅有的阴霾吧,我希望如此,不知道,希望早些赚钱,以此偿还 ...
- 轻量级框架和重量级框架的区别
轻量级框架和重量级框架的区分并没有一个明确的定义,它是个相对概念,通常我们会依据启动资源多少.开发程度难易等进行区分. 一.从启动程序耗费资源来看,EJB(java bean),因为默认提供了EJB规 ...
- MyBatis-学习笔记04【04.自定义Mybatis框架基于注解开发】
Java后端 学习路线 笔记汇总表[黑马程序员] MyBatis-学习笔记01[01.Mybatis课程介绍及环境搭建][day01] MyBatis-学习笔记02[02.Mybatis入门案例] M ...
- 实战 | 尝鲜 Svelte 前端框架,开发读书笔记
提到前端开发框架,我相信大家第一时间想到的就是 Vue.React 和 Angular 三大主流.毕竟它们各个都是 GitHub 上 10w+ star 的知名项目,每个前端工程师至少要学习其中一个框 ...
- 尝鲜 Svelte 前端框架,开发读书笔记
作者鱼皮 来源 | 鱼皮客栈(id:coder_yupi) 提到前端开发框架,我相信大家第一时间想到的就是 Vue.React 和 Angular 三大主流.毕竟它们各个都是 GitHub 上 10w ...
- Struts2 校验框架学习笔记
2019独角兽企业重金招聘Python工程师标准>>> truts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插 ...
- javaee互联网轻量级框架整合开发_企业开发:Spring框架的简易、高效切入篇
原文:http://blog.csdn.net/qq_15096707/article/details/72819930作者:梦小白 介绍 Spring框架是个轻量级的Java EE框架.所谓轻量级, ...
- php consult用法,YanPHP: YanPHP——一个为API开发而设计的高性能轻量级框架
YanPHP V0.2 Guide Documentation 这是一个为API开发而设计的高性能轻量级框架. 框架为你集成了一些常用的类库,让你开发更加便捷. 另外引入了Composer,可以让你更 ...
- ⑤ESP8266 开发学习笔记_By_GYC 【ESP8266 IDF框架 使用C++编程】
⑤ESP8266 开发学习笔记_By_GYC [ESP8266 IDF框架 使用C++编程] 目录 ⑤ESP8266 开发学习笔记_By_GYC [ESP8266 IDF框架 使用C++编程] 一.简 ...
最新文章
- cnil在python_在Python中使用cumprod()计算权益曲线
- linux 修改hostname
- 【渝粤教育】电大中专测量学 (2)作业 题库
- 【C++ STL】priority_queue自定义排序函数
- 百度吉利成立的汽车公司名称曝光,百度持股55%
- 4188元起!华为P40系列国行版发布:买它?
- python爬虫中for循环无法每一段输出_Python入门到掌握只需要这3大,4类,5大,6种,即可,附教程...
- hdu 3183 A Magic Lamp (rmq)
- nc(NetCat)命令
- mysql五:索引原理与慢查询优化
- php中文件读写总结,PHP读取文件_2014.5.26的总结
- 抖音快闪PPT制作教程
- 使用谷歌学术找到引用某篇英文论文的中文文献
- MoveIt! 学习笔记13 - KDL/IKFAST/TRAC-IK运动学求解器区别
- 解决swiper动态改变数据后分页混乱问题
- centos安装mysql5.7.19报 error while loading shared libraries: libaio.so.1
- matlab滤波实验,卡尔曼滤波实验及matlab实现
- 微信和支付宝付款码条码规则
- arduino 定时器、定时中断与PWM使用以及注意事项
- 科研必备工具篇(持续更新)
热门文章
- vue项目启动报错Cannot find module ‘xxx’
- 机器学习之决策树(Decision Tree)
- 车牌检测与识别:License plate detection and recognition (LPDR)
- 错过这次,再等一年!视频云CDN全线折扣Hi购启动...
- ffmpeg开发 av_init_packet()和av_new_packet()
- Hacker Fest: 2019-Walkthrough【VulnHub靶场】渗透测试实战系列3
- Idea编译出现[ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter这个问题
- contos7 安装Redis
- 【单双节锂电池6-8.4V升压9V,12V,24V快充PD升压系统解决方案】
- 洛谷p1307数字反转 c语言