您的位置:首页 > 编程语言 > Java开发

struts2环境搭建---【小白系列】0基础到熟练应用struts2框架(一)

2017-07-03 10:28 736 查看

前记:

        其实一直很反感社会上流传的从入门到精通,这个概念,什么是精通?不是用过一点时间,再把源码看透,怎么敢说精通。好了闲话不扯,本系列教程主要讲解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

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










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



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初始化参数:自定义

后加载的配置文件如果与先加载的配置文件有冲突的话,后覆盖前

详解配置文件

default.properties

位置:struts-core.jar/org/apach/struts2/default.properties
该文件内部配置的是一些常量参数 格式键值对
struts.i18n.encoding=UTF-8 默认编码
post的乱码struts2已经解决 get需要手动解决

struts.objectFactory = 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进行文
4000
件上传默认的 允许上传文件大小

struts-default.xml

位置:struts-core.jar下

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中配置
没什么用

核心filter 初始化参数





Struts2的API

Action的定义的三种方式

1)Action可以定义成一个POJO

2)定义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>

8.回显页面

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struts struts2.0 java 框架
相关文章推荐