Struts学习体验【坚持更新】
2016-06-25 13:15
543 查看
Struts2网站下载地址:点击打开链接
Struts2历史简介:
20世纪,是一个无Web框架的年代,采用的是JSP+Servlet+JavaBean。2001年,
struts1出世了,它是Web框架的主线,只用于MVC层,只支持JSP视图。
2004年,webwork出台,它既支持JSP视图也支持其他视图技术。
2007年,struts出世了,它不是struts1的升级版,但是它继承了struts1的简单性,
而它大多的思想来源于webwork,继承了webwork的思想的先进性。
后来又有了JSF ( JavaServiceFace ),但是市场占有率低,得不到推广。
问:什么是MVC?
答:N层架构:MVC层《控制层----持久层-----数据库层》
MVC层:
------M model(模型层) javaBean技术.
------V view(显示层) JSP、HTML、CSS、JavaScript.
------C controller(控制层)Servlet、Filter、Listener(Web开发三剑客).
问:什么是框架?
答:框架就是一个通用的实用程序,它里面封装了大量通用的操作。
Web框架就是一个位于MVC层的通用的使用程序的集合,封装了web中常见的功能。
例如:转发和重定向,表单验证,参数收集等。
Struts2是属于Web层的框架,它是企业中比较流行的框架,但不是JavaEE5的标志,
JSF是属于Web层的框架,它是JavaEE5的标准,但是它在企业中并不流行。
Struts简单创建过程
1.创建一个WEB项目
2.导入struts包:struts2-core-lib中的jar包,共8个
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
freemarker-2.3.18.jar
javassist-3.11.0.GA.jar
ognl-3.0.3.jar
struts2-core-2.3.1.1.jar
xwork-core-2.3.1.1.jar
3.配置web.xml,加载struts2的核心类
5.建一个普通类Add_Action
6.将一个success.jsp接收计算结果.
结果:${requestScope.result}
2、只能请求是符合/*的模式时,就会经过StrutsPrepareAndExecuteFilter类,该核心类去查询struts.xml文件,根据请求,查找对应的处理类和处理方法,找到后,由核心处理类调用程序员自己写的AddAction类。
3、执行完AddAction类中的业务方法后,将返回到StrutsPrepareAndExecuteFilter类,再由核心类转发到指定的页面
由"命名空间 / Action名"组成,如:
http://127.0.0.1:8080/day31/a/b/add.action
其中/a/b就是命名空间,而add.action就是请求路径,也就是struts.xml中配置的action的name属性值。
Struts2的默认命名空间是
/ ,如果命名空间配置成/xx/yy,那么/xx/yy/ww是可以匹配上的,但是/xx/ww就匹配不上了,因为struts2是逐层匹配的:即/xx/yy/ww没有匹配,它就会找/xx/yy。
Action的访问路径问题:
1、扩展名问题
在Struts2中,默认Action的扩展名有action和空格,计算add.action与add的路径都是访问同一个Action。
在struts2的default.properties配置文件中,配置了Action的默认扩展名,用户也可以自定义扩展名:在src目录下建立struts.properties然后加入如下语句就行了
struts.action.extension=xx,yy,action,,
这样访问路径就可以是/add.xx或/add.yy或/add.actiton或/add
除了可以在struts.properties中配置,也可以在struts.xml中配置:
<constant name="struts.action.extension" value="xx,yy,action,,"></constant>
1、 在struts.xml中action的配置
形式如下:
<action name="addAction"à Action的名字
class="cn.itcast.web.action.addAction" à Action对应的处理类
method="execute">à 指定执行的方法
<result type="dispatcher"à 返回结果方式(重定向...)
name="success">à 与处理类返回值对应
/calculator.jsp 转到哪个页面
</result>
</action>
注意:
1) 如果没有指定class属性,那么默认就是class="com.opensymphony.xwork2.ActionSupport"
2) 如果没有指定method,那么默认就是method="execute"
3) 如果没有指定<result>的name属性,那么就默认name="success"
4) 如果没有指定<result>的type属性,那么默认type="dispatcher
5) 如果没有设置Action的扩展名,默认就是action或无扩展名,可以通过以下两种方式设置扩展名:
src/struts.xml文件:设置struts2框架的默认扩展名
<constant name="struts.action.extension" value="qq,do"/>
src/struts.properties文件:设置struts2框架的默认扩展名
struts.action.extension=xx,yy
多学一招:
当struts.xml和struts.properties都配置了扩展名,那么起作用的是struts.properties,因此,通过一个项目总的属性配置,应该放在struts.properties文件,而struts.xml总的xml文件,只是引用其它的分xml文件,如:
<include file="cn/itcast/web/struts2/config/a-struts.xml"/>
struts.xml文件必须由用户创建的,而struts.properties不用用户创建。
Action的线程安全问题:
Action是非单例模式的,每一次请求都会创建一个Action的实例,因此Action中的实例变量不会出现线程安全问题。
回顾:Servlet、Filter、Listener都是单例的,在使用这”三剑客”的时候要注意线程安全的问题。
u 通过实现一些struts2定义的一些接口来解决
1.获取HttpServletRequest请求对象/域对象
没有实现接口获取Request:ServletActionContext.getRequest()
实现接口获取Request:实现ServletRequestAware接口
2.获取ServletContext域对象
ServletActionContext.getServletContext()
实现ServletContextAware
3.获取HttpSession域对象
ActionContext.getContext().getSession(),返回Map对象
实现SessionAware
在Action处理类中不获取Servlet的相关API:
对于提交过来的数据,在action中可以将相关的参数设置成成员变量,并通过set方法来获取提交过来的数据,然后通过set方法将相关的参数设置到request域中。在页面中就可以用EL表达式来获取相关信息了。
多学一招:为什么获取Session的时候,返回的是一个Map对象?
答:框架这样做的目的,主要是让struts2的Action不与任何与传统Web关联的API,使其独立,这也一种解耦的思想,另外,没有了Servlet的API,便于程序员进行代码测试(Junit)。
耦合:两个不同的模块之间的关联紧密程度。在这里的意思是,struts2框架已经实现了Servlet的相关功能,如果再用Servlet的API的话,那么就会出现交叉使用的情况,这就是耦合,因此,在struts中尽量不要用Servlet的API.
<package name="calculator【包名,相类似的Action类,都应该放在同一个包下】">
<action name="add【请求】"
class="cn.itcast.web.struts2.action.AddAction【请求对应的处理类全路径】"
method="execute【处理类的某个方法】">
<result name="toSuccessJsp【跳转的字符串常量,这个字符串一定要和Action中方法返回值一样】"
type="dispatcher【跳转的方式】">
/WEB-INF/success.jsp【成功后,跳转的真实路径】
</result>
<result
name="input"【验证失败后,跳转的页面,只运用在表单验证中】
type="dispatcher"【跳转的方式】>
/register.jsp【失败后,跳转的真实路径】
</result>
</action>
</package>
struts.properties文件中的属性含义总结:
struts.action.extension=xx,yy,action,,【struts2的请求扩展名】
struts.i18n.encoding=UTF-8【相当于框架自动将post请求中的中文进行URL编码】
request.setCharacterEncoding("UTF-8")
2、 如果想要在返回页面中要访问action中request的域对象,那么就一定要在action加上成员的get方法,由EL底层自动调用。
3、 一组相关的业务操作,一般都会放在同一个Action中。如用户的注册和登录处理方法就应该放在同一个UserAction中。
4、 在action中,要实现表单验证等验证功能,那么可以继承ActionSupport重写validate()方法,正确就进行执行execute()方法返回success,不正确就将错误加入到fieldError中,即是this.addFieldError(key,
value);然后在struts.xml的action中配置一个名为input的result;最后在验证不成功的页面用<s:fielderror
fieldName="usernameError"/>来获取错误消息。
5、 对于POST请求,框架默认采用UTF-8编码方式,无需设置
项目提倡:无参数可以使用GET方式提交,有参数可以使用POST方式提交
Struts2历史简介:
20世纪,是一个无Web框架的年代,采用的是JSP+Servlet+JavaBean。2001年,
struts1出世了,它是Web框架的主线,只用于MVC层,只支持JSP视图。
2004年,webwork出台,它既支持JSP视图也支持其他视图技术。
2007年,struts出世了,它不是struts1的升级版,但是它继承了struts1的简单性,
而它大多的思想来源于webwork,继承了webwork的思想的先进性。
后来又有了JSF ( JavaServiceFace ),但是市场占有率低,得不到推广。
问:什么是MVC?
答:N层架构:MVC层《控制层----持久层-----数据库层》
MVC层:
------M model(模型层) javaBean技术.
------V view(显示层) JSP、HTML、CSS、JavaScript.
------C controller(控制层)Servlet、Filter、Listener(Web开发三剑客).
问:什么是框架?
答:框架就是一个通用的实用程序,它里面封装了大量通用的操作。
Web框架就是一个位于MVC层的通用的使用程序的集合,封装了web中常见的功能。
例如:转发和重定向,表单验证,参数收集等。
Struts2是属于Web层的框架,它是企业中比较流行的框架,但不是JavaEE5的标志,
JSF是属于Web层的框架,它是JavaEE5的标准,但是它在企业中并不流行。
Struts简单创建过程
1.创建一个WEB项目
2.导入struts包:struts2-core-lib中的jar包,共8个
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
freemarker-2.3.18.jar
javassist-3.11.0.GA.jar
ognl-3.0.3.jar
struts2-core-2.3.1.1.jar
xwork-core-2.3.1.1.jar
3.配置web.xml,加载struts2的核心类
<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>4. 在src目录下建一个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="default" namespace="/" extends="struts-default"> <action name="Add_Action" class="cn.itcast.web.action.Add_Action" method="execute"> <result type="dispatcher" name="success"> /WEB-INF/success.jsp </result> </action> </package> </struts>
5.建一个普通类Add_Action
private Integer num1; private Integer num2; private String result; public void setNum1(Integer num1) { this.num1 = num1; } public void setNum2(Integer num2) { this.num2 = num2; } public String getResult() { return result; } public String execute() { result = num1 + num2 + ""; return "success"; }
6.将一个success.jsp接收计算结果.
结果:${requestScope.result}
Struts2的工作流程
1、部署web应用时,web服务器会加载并解析web.xml文件,此时实例化StrutsPrepareAndExecuteFilter类,该核心会自动去查找并加载struts.xml文件。2、只能请求是符合/*的模式时,就会经过StrutsPrepareAndExecuteFilter类,该核心类去查询struts.xml文件,根据请求,查找对应的处理类和处理方法,找到后,由核心处理类调用程序员自己写的AddAction类。
3、执行完AddAction类中的业务方法后,将返回到StrutsPrepareAndExecuteFilter类,再由核心类转发到指定的页面
Struts2基本配置详解
访问Action路径的组成由"命名空间 / Action名"组成,如:
http://127.0.0.1:8080/day31/a/b/add.action
其中/a/b就是命名空间,而add.action就是请求路径,也就是struts.xml中配置的action的name属性值。
Struts2的默认命名空间是
/ ,如果命名空间配置成/xx/yy,那么/xx/yy/ww是可以匹配上的,但是/xx/ww就匹配不上了,因为struts2是逐层匹配的:即/xx/yy/ww没有匹配,它就会找/xx/yy。
Action的访问路径问题:
1、扩展名问题
在Struts2中,默认Action的扩展名有action和空格,计算add.action与add的路径都是访问同一个Action。
在struts2的default.properties配置文件中,配置了Action的默认扩展名,用户也可以自定义扩展名:在src目录下建立struts.properties然后加入如下语句就行了
struts.action.extension=xx,yy,action,,
这样访问路径就可以是/add.xx或/add.yy或/add.actiton或/add
除了可以在struts.properties中配置,也可以在struts.xml中配置:
<constant name="struts.action.extension" value="xx,yy,action,,"></constant>
1、 在struts.xml中action的配置
形式如下:
<action name="addAction"à Action的名字
class="cn.itcast.web.action.addAction" à Action对应的处理类
method="execute">à 指定执行的方法
<result type="dispatcher"à 返回结果方式(重定向...)
name="success">à 与处理类返回值对应
/calculator.jsp 转到哪个页面
</result>
</action>
注意:
1) 如果没有指定class属性,那么默认就是class="com.opensymphony.xwork2.ActionSupport"
2) 如果没有指定method,那么默认就是method="execute"
3) 如果没有指定<result>的name属性,那么就默认name="success"
4) 如果没有指定<result>的type属性,那么默认type="dispatcher
5) 如果没有设置Action的扩展名,默认就是action或无扩展名,可以通过以下两种方式设置扩展名:
src/struts.xml文件:设置struts2框架的默认扩展名
<constant name="struts.action.extension" value="qq,do"/>
src/struts.properties文件:设置struts2框架的默认扩展名
struts.action.extension=xx,yy
多学一招:
当struts.xml和struts.properties都配置了扩展名,那么起作用的是struts.properties,因此,通过一个项目总的属性配置,应该放在struts.properties文件,而struts.xml总的xml文件,只是引用其它的分xml文件,如:
<include file="cn/itcast/web/struts2/config/a-struts.xml"/>
struts.xml文件必须由用户创建的,而struts.properties不用用户创建。
Action的线程安全问题:
Action是非单例模式的,每一次请求都会创建一个Action的实例,因此Action中的实例变量不会出现线程安全问题。
回顾:Servlet、Filter、Listener都是单例的,在使用这”三剑客”的时候要注意线程安全的问题。
Struts2与ServletAPI的解耦
在struts2的Action处理类中,可以使用ServletActionContext和ActionContext获取Servlet的相关API,如HttpServletRequest等,但是,既然Struts2是对MVC进行封装的框架,那么这些Servlet的API就不应该出现了,否则就会出现耦合现象。
为此,struts采用了一些办法来消除这种弊端。u 通过实现一些struts2定义的一些接口来解决
1.获取HttpServletRequest请求对象/域对象
没有实现接口获取Request:ServletActionContext.getRequest()
实现接口获取Request:实现ServletRequestAware接口
2.获取ServletContext域对象
ServletActionContext.getServletContext()
实现ServletContextAware
3.获取HttpSession域对象
ActionContext.getContext().getSession(),返回Map对象
实现SessionAware
在Action处理类中不获取Servlet的相关API:
对于提交过来的数据,在action中可以将相关的参数设置成成员变量,并通过set方法来获取提交过来的数据,然后通过set方法将相关的参数设置到request域中。在页面中就可以用EL表达式来获取相关信息了。
多学一招:为什么获取Session的时候,返回的是一个Map对象?
答:框架这样做的目的,主要是让struts2的Action不与任何与传统Web关联的API,使其独立,这也一种解耦的思想,另外,没有了Servlet的API,便于程序员进行代码测试(Junit)。
耦合:两个不同的模块之间的关联紧密程度。在这里的意思是,struts2框架已经实现了Servlet的相关功能,如果再用Servlet的API的话,那么就会出现交叉使用的情况,这就是耦合,因此,在struts中尽量不要用Servlet的API.
struts.xml文件中的属性含义总结:
struts.xml文件中的属性含义总结:<package name="calculator【包名,相类似的Action类,都应该放在同一个包下】">
<action name="add【请求】"
class="cn.itcast.web.struts2.action.AddAction【请求对应的处理类全路径】"
method="execute【处理类的某个方法】">
<result name="toSuccessJsp【跳转的字符串常量,这个字符串一定要和Action中方法返回值一样】"
type="dispatcher【跳转的方式】">
/WEB-INF/success.jsp【成功后,跳转的真实路径】
</result>
<result
name="input"【验证失败后,跳转的页面,只运用在表单验证中】
type="dispatcher"【跳转的方式】>
/register.jsp【失败后,跳转的真实路径】
</result>
</action>
</package>
struts.properties文件中的属性含义总结:
struts.action.extension=xx,yy,action,,【struts2的请求扩展名】
struts.i18n.encoding=UTF-8【相当于框架自动将post请求中的中文进行URL编码】
request.setCharacterEncoding("UTF-8")
总结:
1、 想要在action中获取到提交表单的数据,可以再action中定义同名的成员变量,并且加上对应的set方法,由struts框架底层自动调用。2、 如果想要在返回页面中要访问action中request的域对象,那么就一定要在action加上成员的get方法,由EL底层自动调用。
3、 一组相关的业务操作,一般都会放在同一个Action中。如用户的注册和登录处理方法就应该放在同一个UserAction中。
4、 在action中,要实现表单验证等验证功能,那么可以继承ActionSupport重写validate()方法,正确就进行执行execute()方法返回success,不正确就将错误加入到fieldError中,即是this.addFieldError(key,
value);然后在struts.xml的action中配置一个名为input的result;最后在验证不成功的页面用<s:fielderror
fieldName="usernameError"/>来获取错误消息。
5、 对于POST请求,框架默认采用UTF-8编码方式,无需设置
项目提倡:无参数可以使用GET方式提交,有参数可以使用POST方式提交
相关文章推荐
- java8快速入门
- java c3p0连接池 不用spring单独使用c3p0
- 54. spring boot日志升级篇—logback【从零开始学Spring Boot】
- csdn博客刷点击率(java代码)
- 工程目录 Java/Web/Maven
- Java中的泛型
- 学习笔记:第12章 Java语言程序设计
- 解决Hibernate中自动生成的findByProperty函数无法工作的问题-java SSH整合系列
- 《编程导论(Java)·9.3.1回调·2》什么是好莱坞法则
- Java学习日记 求最值 排序 选择 冒泡 交换
- Java学习日记 查表法十进制转十六进制
- springboot-基础入门
- <JAVA学习笔记6>——程序死锁、中断
- Java堆和栈的区别
- 美就是Java.不会有学MFC的痛苦
- 搭起Java开发环境
- java基础(一)
- java 基础二
- java中向上转型和向下转型
- Java注解提供了关于代码的一些信息