前记:
其实一直很反感社会上流传的从入门到精通,这个概念,什么是精通?不是用过一点时间,再把源码看透,怎么敢说精通。好了闲话不扯,本系列教程主要讲解struts2的入门到熟练使用,同样也是我个人学习笔记,以及我对struts2的理解
Struts2概念
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小
以上是百度百科给我们的答案,那么我自己的理解就是Strurs是一款web表现层的框架,它采用了mvc的设计模式。常见的javaweb .net php python等等 不过作为我们的JavaEE攻城狮来说是轻mvc重三层架构的三层架构(web service dao)这是我们javaweb特有的。其实struts2和struts1关系不大,因为它是在WebWork的基础上二次开发。你也可以理解成java和JavaScript,只是借用个名头而已所以 struts2是WebWork的升级版 Struts2基于WebWork,而WebWork 又基于xwork
以上是百度百科给我们的答案,那么我自己的理解就是Strurs是一款web表现层的框架,它采用了mvc的设计模式。常见的javaweb .net php python等等 不过作为我们的JavaEE攻城狮来说是轻mvc重三层架构的三层架构(web service dao)这是我们javaweb特有的。其实struts2和struts1关系不大,因为它是在WebWork的基础上二次开发。你也可以理解成java和JavaScript,只是借用个名头而已所以 struts2是WebWork的升级版 Struts2基于WebWork,而WebWork 又基于xwork
Struts2快速入门
其实struts2就是插拔式的一个框架,所谓的插拔式就是,你想用就用,不想用了就扔掉,很方便。通俗点就是在web.xml中配一个过滤器,让每一次请求都去走这个过滤器。
加上过滤器就算使用struts2,不加就不用了。
执行流程:
客户端发送请求
tomcat服务器解析请求并且将请求数据封装到request
然后通过过滤器,找到struts.xml中的与请求相对的action
执行action方法,返回结果
1.导入struts2所需jar包
\struts2下载\struts-2.3.24-all\struts-2.3.24\apps\struts2-blank\WEB-INF\lib下所有包
\资料\其他jar包\hibernate基本jar
2.在web.xml配置过滤器
<filter>
<filter-name>Struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.创建Action
<filter>
<filter-name>Struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3.创建Action
public class QuickTestAction {
public void execute() {
System.out.println("Test action .... ");
}
public String save(){
return "save";
}
public String update(){
return "update";
}
public String delete(){
return "delete";
}
}
4.在src下创建struts.xml
public class QuickTestAction {
public void execute() {
System.out.println("Test action .... ");
}
public String save(){
return "save";
}
public String update(){
return "update";
}
public String delete(){
return "delete";
}
}
5.配置struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="mytest" extends="struts-default" namespace="/">
<action name="test" class="com.test.struts.QuickTestAction"></action>
</package>
</struts>
我们来访问测试下
http://localhost:8080/strutsTest/test
如果控制台成功输出则struts2配置完成。
struts2核心过滤器详解
StrutsPrepareAndExecuteFilter(Struts准备和执行过滤器)
进入这个Filter然后依次查看实现
dispatcher = init.initDispatcher(config);//查看实现
dispatcher.init();//查看实现
服务器在启动时,创建filter对象,就会执行init()方法,然后加载配置文件
加载顺序:
default.properties:struts2自己定义好的配置文件
struts-default.xml:struts2自己定义好的配置文件
struts-plugin:struts2插件自己定义好的配置文件
struts.xml:自定义的
struts.properties:自定义
核心filter初始化参数:自定义
后加载的配置文件如果与先加载的配置文件有冲突的话,后覆盖前
struts-default.xml:struts2自己定义好的配置文件
struts-plugin:struts2插件自己定义好的配置文件
struts.xml:自定义的
struts.properties:自定义
核心filter初始化参数:自定义
后加载的配置文件如果与先加载的配置文件有冲突的话,后覆盖前
详解配置文件
default.properties
位置:struts-core.jar/org/apach/struts2/default.properties
该文件内部配置的是一些常量参数 格式键值对
struts.i18n.encoding=UTF-8 默认编码
post的乱码struts2已经解决 get需要手动解决
struts.objectFactory = spring
指定Action是由哪个框架创建的 这句话的意思是把action的创建权限交给spring
指定Action是由哪个框架创建的 这句话的意思是把action的创建权限交给spring
struts.devMode = false
develope mode 是否设置为开发模式
如果设置为true 变成开发模式 当修改struts.xml配置文件后不需要重启服务
struts.action.extension=action,,
Action访问时的默认扩展名 例如 abc,,def,那么(*.abc ) ( *) (*.def)可以访问到资源
struts.multipart.maxSize=2097152
使用struts2进行文件上传默认的 允许上传文件大小
struts-default.xml
位置:struts-core.jar下
1)功能bean
2)常量
3)抽象包
4)结果跳转类型
5)拦截器
在自己的xml配置文件中覆盖struts-default包内部的默认配置
1)功能bean
2)常量
3)抽象包
4)结果跳转类型
5)拦截器
在自己的xml配置文件中覆盖struts-default包内部的默认配置
struts.xml配置(包括action的配置)
在src下创建struts.xml--自定义 配置自己的内容 配置覆盖之前文件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<!-- 根标签 -->
<struts>
<!-- 常量 键值对 -->
<constant name="struts.devMode" value="true"></constant>
<constant name="struts.action.extension" value="action,abc,def,,"></constant>
<!-- 动态方法调用的开启 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<!-- package包配置 包内部配置action
package包是一个虚拟包/逻辑包 不存在 主要目的方便action的管理
属性:
name:包的名称 包名称不能重复
namespace:命名空间 该命名空间与Action的name一起组成访问的虚拟地址
例如: namespace="/customer"
url:http://localhost:8080/Struts2_Day01/customer/quick.action
extends:该包继承哪个包 一般情况下 继承struts-default
继承了包 才能使用父包中都已经定义好的一些内容
abstract:声明该包是否是一个抽象包 只能被别的包继承 不能创建Action
-->
<package name="test" namespace="/" extends="struts-default">
<!-- <interceptors>
声明自己定义的拦截器
<interceptor name="myInterceptor" class="全包名"></interceptor>
定义拦截器栈
<interceptor-stack name="myStack">
<interceptor-ref name="myInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
引用默认的拦截器栈
<default-interceptor-ref name="myStack" /> -->
<!-- 定义自己的结果类型 -->
<!-- <result-types>
<result-type name="myResultType" class="com.opensymphony.xwork2.ActionChainResult"/>
</result-types> -->
<!-- 定义Action:封装逻辑代码的类
属性:
name:该Action的虚拟名称 该name与namespace一起组成访问的虚拟的地址
class:该Action全限定名
method:指定访问该Action中的哪个方法
-->
<action name="quick" class="cn.nanjin.action.QuickAction" method="save">
<!-- 结果视图
属性:
name:逻辑视图名
result标签体中配置实际的页面的地址
type: 跳转方式 转发 重定向..
-->
<result name="success">/success.jsp</result>
<result name="save">/save.jsp</result>
<result name="update">/update.jsp</result>
</action>
<action name="update" class="cn.nanjin.action.QuickAction" method="update">
<result name="success">/success.jsp</result>
<result name="save">/save.jsp</result>
<result name="update">/update.jsp</result>
</action>
<!--
*代表任意 标识通配符
{n} n代表第几个*
例如:
http://localhost:8080/Struts2_Day01/quick2_save.action
*===save
method="save"
http://localhost:8080/Struts2_Day01/quick2_update.action
*===update
method="update"
-->
<!-- 重点 -->
<action name="quick2_*" class="cn.nanjin.action.QuickAction2" method="{1}">
<result name="delete">/success.jsp</result>
<result name="save">/save.jsp</result>
<result name="update">/update.jsp</result>
</action>
<!--
例如:
http://localhost:8080/quick3_save_User.action
第一个*===save
第二个*===User
method=saveUser
http://localhost:8080/quick3_update_User.action
第一个*===uodate
第二个*===User
method=updateUser
-->
<action name="quick3_*_*" class="cn.nanjin.action.QuickAction3" method="{1}{2}">
<result name="delete">/success.jsp</result>
<result name="save">/save.jsp</result>
<result name="update">/update.jsp</result>
</action>
<!-- 动态方法调用(了解)
开启动态方法调用(默认是关闭)
xml配置简单 如下配置
页面访问url有要求
配置一个常量:
struts.enable.DynamicMethodInvocation = true
例如:
http://localhost:8080/Struts2_Day01/quick4!save.action
http://localhost:8080/Struts2_Day01/quick4!update.action
-->
<action name="quick4" class="cn.nanjin.action.QuickAction4">
<result name="delete">/success.jsp</result>
<result name="save">/save.jsp</result>
<result name="update">/update.jsp</result>
</action>
</package>
<!-- 加载其他的struts配置文件,分模块开发 -->
<!-- <include file="struts-customer.xml"></include>
<include file="struts-linkman.xml"></include> -->
</struts>
struts.properties
只能配置常量 键值对
实际开发中 一般常量习惯在struts.xml中配置
实际开发中 一般常量习惯在struts.xml中配置
没什么用
核心filter 初始化参数
Struts2的API
Action的定义的三种方式
1)Action可以定义成一个POJO2)定义Action类实现Action接口
好处:规范开发 Action接口提供了5个直接使用的常量
3)定义的Action类继承ActionSupport(重点)
子的功能更加强大 例如 可以进行国际化 表单校验....
综合案例:
需求
编写程序实现查询所有客户信息并回显页面
步骤
1.实体类 Customer.java
public class Customer implements Serializable {
private Long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
2.hibernate映射Customer.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.test.domain.Customer" table="cst_customer">
<id name="cust_id">
<generator class="native"></generator>
</id>
<property name="cust_name"></property>
<property name="cust_source"></property>
<property name="cust_industry"></property>
<property name="cust_level"></property>
<property name="cust_phone"></property>
<property name="cust_mobile"></property>
</class>
</hibernate-mappin
3.hibernate主配置文件 hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 1、数据库连接信息 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///struts_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 2、hiebernate其他参数 可选 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 3、加载映射 -->
<mapping resource="com/test/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
4.action
public class CustomerAction extends ActionSupport {
public String findCustomerList(){
try {
//业务处理
CustomerService service =new CustomerServiceimpl();
List<Customer> list =service.findCustomerList();
ServletActionContext.getRequest().setAttribute("list", list);
return "success";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
5.serviceimpl
public List<Customer> findCustomerList() throws Exception {
List<Customer> result =null;
CustomerDao dao=new Customerimpl();
result =dao.findCustomerList();
return result;
}
6.dao
public List<Customer> findCustomerList() throws Exception {
List<Customer> result =null;
String hql ="from Customer ";
Configuration conf =new Configuration().configure();
SessionFactory factory = conf.buildSessionFactory();
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Query query = session.createQuery(hql);
result =query.list();
tx.commit();
session.close();
factory.close();
return result;
}
7.struts.xml
<action name="customer_*" class="com.test.struts.CustomerAction" method="{1}">
<result name="success">/jsp/customer/list.jsp</result>
</action>