Struts学习体验【坚持更新】

来源:互联网 发布:偏微分方程数值解 知乎 编辑:程序博客网 时间:2024/06/05 03:50

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的核心类

<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中配置的actionname属性值。

Struts2的默认命名空间是 / ,如果命名空间配置成/xx/yy,那么/xx/yy/ww是可以匹配上的,但是/xx/ww就匹配不上了,因为struts2是逐层匹配的:即/xx/yy/ww没有匹配,它就会找/xx/yy

 

 Action的访问路径问题:

1、扩展名问题

Struts2中,默认Action的扩展名有action和空格,计算add.actionadd的路径都是访问同一个Action

struts2default.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.xmlaction的配置

形式如下:

<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中的实例变量不会出现线程安全问题。

回顾:ServletFilterListener都是单例的,在使用这”三剑客”的时候要注意线程安全的问题。

Struts2ServletAPI的解耦

struts2Action处理类中,可以使用ServletActionContextActionContext获取Servlet的相关API,如HttpServletRequest等,但是,既然Struts2是对MVC进行封装的框架,那么这些ServletAPI就不应该出现了,否则就会出现耦合现象。

为此,struts采用了一些办法来消除这种弊端。

u 通过实现一些struts2定义的一些接口来解决

1.获取HttpServletRequest请求对象/域对象

没有实现接口获取RequestServletActionContext.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对象?

答:框架这样做的目的,主要是让struts2Action不与任何与传统Web关联的API,使其独立,这也一种解耦的思想,另外,没有了ServletAPI,便于程序员进行代码测试(Junit)

耦合:两个不同的模块之间的关联紧密程度。在这里的意思是,struts2框架已经实现了Servlet的相关功能,如果再用ServletAPI的话,那么就会出现交叉使用的情况,这就是耦合,因此,在struts中尽量不要用ServletAPI.

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、 如果想要在返回页面中要访问actionrequest的域对象,那么就一定要在action加上成员的get方法,由EL底层自动调用。

3、 一组相关的业务操作,一般都会放在同一个Action中。如用户的注册和登录处理方法就应该放在同一个UserAction中。

4、 在action中,要实现表单验证等验证功能,那么可以继承ActionSupport重写validate()方法,正确就进行执行execute()方法返回success,不正确就将错误加入到fieldError中,即是this.addFieldError(key, value);然后在struts.xmlaction中配置一个名为inputresult;最后在验证不成功的页面用<s:fielderror fieldName="usernameError"/>来获取错误消息。

5、 对于POST请求,框架默认采用UTF-8编码方式,无需设置

项目提倡:无参数可以使用GET方式提交,有参数可以使用POST方式提交




0 0
原创粉丝点击