1 struts2框架应用javaee三层结构中web层框架
2 struts2框架在struts1和webwork基础之上发展全新的框架
3 struts2解决问题:
4 struts2版本
5 web层常见框架
(1)struts2
(2)springMVC
在lib中有jar包,不能把这些jar都导入到项目中
复制 struts-2.3.31\apps\struts2-blank\WEB-INF\lib 下的所有 jar 包到当前 web 应用的 lib 目录下.
- 核心配置文件名称和位置是固定的
- 位置必须在src下面,名称 struts.xml
复制 struts-2.3.31\apps\struts2-blank\WEB-INF\classes下的 struts.xml 文件到当前 web 应用的 src 目录下.
访问路径:
http://127.0.0.1/struts2_day01/hello.action
复制 struts-2.3.31\apps\struts2-blank1\WEB-INF\web.xml 文件中的过滤器的配置到当前 web 应用的 web.xml 文件中
<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>画图分析过程
1 过滤器在服务器启动时候创建,创建过滤器时候执行init方法
(1)在init方法中主要加载配置文件
- 包含自己创建的配置文件和struts2自带配置文件
** struts.xml
** web.xml
1 名称和位置固定的
2 在配置文件中主要三个标签 package、action、result,标签里面的属性
<struts> <!—1、包含的其他配置文件 --> <!—include file=" " --> <!– 2、定义struts常量--> <constant name="常量名称 " value="常量值 " /> <!—3、定义bean --> <bean name="bean名称" class="" scope=" " static= " " option=" "/> <!—4、定义包,package元素是Struts配置文件的核心 --> <package name="struts-default" extends="" namespace="名称空间" abstract="" externalReferenceResolver> <!—5、定义返回值 --> <result-types> <result-type name="" class="" default="true|false"> <param name="参数名" >参数值</param> </result-type> </result-types> <!—6、定义Action --> <action name="用户请求名" class="Action实现类" method="调用Action类的方法" > <result name="Action定义的结果名">物理视图地址 </result> </action> <!—7、定义拦截器 --> <interceptors> <interceptor name="" class=""/> <interceptor-stack name=""> <interceptor-ref name=""/> </interceptor-stack> <default-interceptor-ref name="defaultStack"/> </interceptors> </package> </struts>1 类似于代码包,区别不同的action,要配置action,必须首先写package标签,在package里面才能 配置action
2 package标签属性
(1)name属性
- name属性值根功能本身没有关系的,
- 在一个配置文件中可以写多个package标签,name属性值不能相同的
(2)extends属性
- 属性值固定的,struts-default
- 写了这个属性之后,在package里面配置的类具有action功能
(3)namespace属性
- namespace属性值和action标签里面的name属性值构成访问路径
1 action标签配置action访问路径
2 action标签属性
(1)name属性
namespace属性值和action标签里面的name属性值构成访问路径
在package标签里面写多个action标签,但是action的name属性值不能相同的
(2)class属性
action全路径
(3)method属性
比如在action里面默认执行的方法execute方法,但是在action里面写其他的方法
让action里面多个方法执行,使用method进行配置
1 根据action的方法返回值,配置到不同的路径里面
2 result标签属性
(1)name属性
- 和方法返回值一样
(2)type属性
- 配置如何到路径中(转发或者重定向)
- type属性默认值做转发操作
1 struts2框架,帮我们实现一部分功能,struts2里面有常量,在常量里面封装一部分功能
2 struts2默认的常量位置(记住)
3 修改struts2默认常量值
(1)常用的方式
- 在struts.xml中进行配置
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
(2)还有两种方式(了解)
- 在src下面创建 struts.properties,进行修改
- 在web.xml进行配置
4 介绍最常用常量(明天演示)
(1)表单提交数据到action里面,在action可以获取表单提交数据,
(2)表单提交数据有中文,有乱码问题,解决:
- post提交直接设置编码
- get提交做编码转换
(3)如果在action获取表单通过post方式提交中文,中文乱码问题帮解决了,不需要自己处理问题
1 单独写配置文件,把配置文件引入到核心配置文件中
这个不继承任何类,不实现任何接口
实现接口 Action
public classUserAction implementsAction{ @Override public String execute() throws Exception { return null; } }
源代码:
默认执行execute()方法
public interface Action { public abstract String execute() throws Exception; //执行成功,返回成功界面 public static final String SUCCESS = "success"; //执行成功,不需要返回成功界面 public static final String NONE = "none"; //执行失败,eg:信息验证失败 public static final String ERROR = "error"; //根据输入信息比如页码跳转 public static final String INPUT = "input"; //Action验证失败重新登录 public static final String LOGIN = "login"; }继承类ActionSupport(一般使用)
//继承类 public classPersonAction extends ActionSupport{ }
1 有三种方式实现
第一种 使用action标签的method属性,在这个属性里面写执行的action的方法
第二种 使用通配符方式实现
第三种 动态访问实现(不用)
2 演示错误
(1)如果action方法有返回值,在配置文件中没有配置,出现错误
(2)在action里面的方法有返回值,如果有返回值时候类型必须是String
(3)action里面的方法可以没有返回值,没有返回值时候,在result标签不需要配置
- 把方法写成void
- 让返回值,返回 ”none”
1 创建action,创建多个方法
public classBookAction extends ActionSupport{ //添加 public String add() { System.out.println("add.............."); return NONE; } //修改 public String update() { System.out.println("update.............."); return NONE; } }2 使用method配置
缺陷:action每个方法都需要配置,如果action里面有多个方法,配置很多的action
在action标签里面name属性,name属性值里面写 符号 * 星号
* 理解: 表示匹配任意内容
比如访问hello,* 可以匹配到;比如访问add,* 可以匹配到
被通配符匹配到的 URI 字符串的子串可以用 {1}, {2} 来引用. {1} 匹配第一个子串, {2} 匹配第二个子串…{0} 匹配整个 URI
<!-- 通配符方式实现 --> <package name="tongdemo" namespace="/"extends="struts-default"> <!-- name属性值里面写符号 * (1)执行action里面的add方法,访问 book_add,使用book_*可以匹配到,*相当于变成 add (2)执行action里面的update方法,访问book_update,使用book_*可以匹配到,*相当于变成 update 上面两个路径使用 book_* 可以匹配到 method属性写*值 --> <action name="book_*"class="struts.action.tongpeifu.BookAction"method="{1}"> </action> </package>
Action执行的时候并不一定要执行execute方法,可以在配置文件中配置Action的时候用 “method=”来指定执行哪个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐)
Jsp:
<ahref="/user/userAdd">添加用户</a>
<ahref="/user/user!add">添加用户</a>
前者会产生太多的action,所以不推荐使用
struts.xml:
<constant name="struts.devMode"value="true" /> <package name="user"extends="struts-default" namespace="/user"> <action name="user" class="struts2.user.action.UserAction"method="add"> <result>/user_add_success.jsp</result> </action> <action name="user" class="struts2.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package>action:
public classCustomerAction extends ActionSupport { //客户列表 public String list() { //调用service CustomerServiceservice = newCustomerService(); List<Customer>list = service.findAll(); //放到域对象里面(明天讲到) HttpServletRequestrequest = ServletActionContext.getRequest(); request.setAttribute("list", list); return "list"; } }Servive:
public classCustomerService { public List<Customer>findAll() { CustomerDaodao = newCustomerDaoImpl(); return dao.findAll(); } }struts.xml:
<package name="demo" extends="struts-default"namespace="/"> <action name="customer_*" class="cn.itcast.action.CustomerAction" method="{1}"> <result name="list">/jsp/customer/list.jsp</result> </action> </package>
源代码文件:http://download.csdn.net/detail/qq_26553781/9774592