Struts2学习
Posted 寒潭渡鹤影
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2学习相关的知识,希望对你有一定的参考价值。
struts2概述
1.struts2框架应用javaee三层结构中web层框架。
2.strut2框架在struts1和webwork基础之上发展全新的框架。
3.struts2解决的问题:
4.版本:struts2.3.24
5.web层常见框架
(1)struts2
(2)springMVC
Struts2框架入门
配置action类访问路径
(1)创建struts2核心配置文件
-核心配置文件名和位置是固定的,
-位置必须在src下面,名称struts.xml
(2)引入dtd约束
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
struts.xml基本配置
<struts> <package name="hellodemo" extends="struts-default" namespace="/"> <!-- name:访问名称 --> <action name="hello" class="cn.itcast.action.HelloAction"> <!-- 配置方法的返回值到页面 --> <result name="ok">/hello.jsp</result> </action> </package> </struts>
配置struts2过滤器
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <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>*.action</url-pattern> </filter-mapping> </web-app>
struts2执行过程
过滤器在服务器启动时创建。
1.在过滤器实现功能
①获取请求路径
②.得到路径里面的hello值
2.①到src下面找struts.xml,使用dom4j解析
②拿着hello值到xml文件找action标签,匹配name属性值是否一样。
3.匹配name属性值一样,都是hello
找到name属性所在的action标签里面另外一个属性class值,就是action的全路径,得到的值就是action全路径。然后使用反射操作
//通过字节码文件得到源码 Class clazz = Class.forName("action全路径"); //得到名称是execute的方法 Method m = clazz.getMethod("execute"); //方法执行 Object obj = m.invoke(); //第四步 //得到action方法的返回值 //在struts.xml文件中,找到action标签里面有result标签,匹配result标签里的name属性是否一样 //如果一样,跳转到配置页面中
web.xml里过滤器名字是:StrutsPrepareAndExecuteFilter(最好记住,面试可能要用)
1.过滤器在服务器启动时创建,创建过滤器时候执行init方法。
(1)在init方法中主要加载配置文件
包含自己创建的配置文件和struts2自带的配置文件
在Dispatcher中有代码
private static final String DEFAULT_CONFIGURATION_PATHS = "struts-default.xml,struts-plugin.xml,struts.xml";
try { init_FileManager(); init_DefaultProperties(); // [1] init_TraditionalXmlConfigurations(); // [2] init_LegacyStrutsProperties(); // [3] init_CustomConfigurationProviders(); // [5] init_FilterInitParameters() ; // [6] init_AliasStandardObjects() ; // [7] Container container = init_PreloadConfiguration(); container.inject(this); init_CheckWebLogicWorkaround(container); if (!dispatcherListeners.isEmpty()) { for (DispatcherListener l : dispatcherListeners) { l.dispatcherInitialized(this); } } errorHandler.init(servletContext); }
主要加载的配置文件
主要关心的是struts.xml和web.xml。
在服务器启动时会创建过滤器,然后加载struts.xml文件。
Struts配置
1.名称和路径是固定的。
2.在配置文件中主要有三个表情package、action、result
标签package
1.package类似于代码包,区别不同的action,要配置action,必须首先写package标签,在package里面才能配置action
2.package标签属性
(1)name属性
name属性值和功能本身没有关系的,在一个配置文件中可以写多个package标签,name属性值不能相同
(2)extends属性
-属性值固定的,struts-default
-写了这个属性之后,在package里面配置的类具有action功能,写了这句话,里面配置的类才具有action的功能。
(3)namespace属性
-namespace属性值和action标签里面的name属性值构成访问路径。默认是"/"。
标签action
1.action标签配置action访问路径
2.action标签属性
(1)name属性
-namespace属性值和action标签里面的name属性值构成访问路径
-在package标签里面写多个action标签,但是action的name属性值不能相同的
(2)class属性
-action全路径
(3)method属性
-比如在action里面可以默认执行的方法是execute方法,但是在action里面可以写其他方法。
-让action里面多个方法执行,使用method进行配置
result标签
1.根据action(其实就是一个类)的方法返回值,配置到不同的路径里面。
2.result标签属性
(1)name属性
-和方法返回值一样
<!-- 配置方法的返回值到页面 --> <result name="ok">/hello.jsp</result>
(2)type属性
-配置如何到路径中(转发或者重定向)
-type属性的默认值 做转发操作
转发(地址栏不会变)
修改struts2默认常量值
(1)常用的方式
在struts.xml中进行配置
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
(2)还有两种方式(了解)
-在src下面创建struts.properties,进行修改
-在web.xml进行配置
介绍最常用常量
struts.i18n.encoding
(1)表单提交数据到action里面,在action可以获取表单提交数据
(2)表单提交数据有中文,有乱码问题,解决:
-post提交直接设置编码
-get提交编码转换
(3)如果在action获取表单通过post方式提交中文,中文乱码问题解决了,不需要自己处理问题。
分模块开发
1.单独写配置文件,把配置文件引入到核心配置文件中。
<!-- 引入hello.xml文件 -->
<include file="cn/itcast/action/hello.xml"></include>
<?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> <include file="cn/itcast/action/hello.xml"></include> </struts>
在该目录下创建hello.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> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <package name="hellodemo" extends="struts-default" namespace="/"> <!-- name:访问名称 --> <action name="hello" class="cn.itcast.action.HelloAction"> <!-- 配置方法的返回值到页面 --> <result name="ok">/hello.jsp</result> </action> </package> </struts>
Action编写方式
1.action编写有三种方式
第一种 创建普通类,这个类不继承任何类,不实现任何借口
第二种 创建类,实现接口 Action
public class UserAction implements Action { @Override public String execute() throws Exception { // TODO Auto-generated method stub //return "success"; return SUCCESS; } }
这种方式很少用,因为实现接口,不管用不用里面的方法,都要实现它的方法。
第三种 创建类,继承类ActionSupport
public class PersonAction extends ActionSupport { @Override public String execute(){ return SUCCESS; } }
访问action的方法(重点)
1.有三种方式实现
第一种 使用action标签的method属性,在这个属性里面写执行的action的方法
第二种 使用通配符方式实现
第三种 动态访问实现(不用)
(1)如果action方法有返回值,在配置文件中没有配置,出现错误。
(2)在action里面的方法有返回值,如果有返回值时类型必须是String。
(3)action里面的方法可以没有返回值,没有返回值,在result标签里就不需要配置。
-把方法返回值写成void(不建议)
-返回Action.NONE
public class PersonAction extends ActionSupport { @Override public String execute(){ return NONE; } }
这样就无法跳转到指定页面了,在action里就可以不用谢<result/>标签了。
1.创建action,创建多个方法
public class BookAction extends ActionSupport { //添加 public String add(){ System.out.println("add............."); return NONE; } //修改 public String update(){ System.out.println("update..........."); return NONE; } }
2.使用method配置
<package name="methoddemo" extends="struts-default" namespace="/"> <!-- 有method属性:写要执行的action里面的方法的名称 --> <action name="addAction" class="cn.itcast.method.BookAction" method="add"> </action> <!-- 执行update方法 --> <action name="updateAction" class="cn.itcast.method.BookAction" method="update"> </action> </package>
缺陷:action的每个方法都要配置,如果action里面有多个方法,配置很多的actions.
使用通配符实现(重点)
1.在action标签里面name属性,name属性值里面写符号*
(1)*理解:表示匹配任意内容
-比如访问hello,*可以匹配到
-比如访问add,*可以匹配到
<action name="book_*" class="cn.itcast.method.BookAction" method="{1}"> </action>
这两个网址都可以匹配到。
book_*,里面的*相当于变成update
最终执行action的方法名称是update
在method属性里面写update就可以了。
3动态访问
不需要使用method属性,直接在访问上写!
以上是关于Struts2学习的主要内容,如果未能解决你的问题,请参考以下文章