Struts 2

Struts1 和 Struts2 没有任何关系.

Struts2 前身是 WebWorks 采用MVC设计模式的WEB应用框架.

使用Struts2

步骤:

  1. 导包
  2. 配置
    1. 主控制器的配置 web.xml
    2. 配置子控制器 struts.xml
    3. 测试
  3. Hello World
    1. 编写子控制器
    2. JSP
    3. 配置 控制器和JSP的转发关系
  4. 部署测试.


流结果

流结果不仅可以处理图片,它可以处理任何类型的文件,比如处理Excel文件。

案例:

  1. 导入Excel API:Apache POI

    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.9</version>
    </dependency>
    
  2. 编写控制器

    public class ExcelAction {
        private InputStream excel;
    
        public InputStream getExcel() {
            return excel;
        }
        public void setExcel(InputStream excel) {
            this.excel = excel;
        }
    
        public String execute(){
            try {
                byte[] data = createExcel();
                excel=new ByteArrayInputStream(data);
                return "exl";
            } catch (IOException e) {
                e.printStackTrace();
                return "error";
            }
        }
    
        public byte[] createExcel() throws IOException{
            // Apache poi
            // 工作簿   >工作表>行>格子
            //workbook> sheet>row>cell
    
            //创建工作簿
            HSSFWorkbook workbook=new HSSFWorkbook();
            //在工作簿中创建工作表
            HSSFSheet sheet = workbook.createSheet("演示");
            //工作表里创建数据行
            HSSFRow row = sheet.createRow(0);
            //在行中创建格子
            HSSFCell c1 = row.createCell(0);
            //在格子中添加内容
            c1.setCellValue("编号");
            row.createCell(1).setCellValue("内容");
            //再添加一行
            row = sheet.createRow(1);
            row.createCell(0).setCellValue("1");
            row.createCell(1).setCellValue("Hello World!");
            //将excel对象转换为数据
            ByteArrayOutputStream out=new ByteArrayOutputStream();
            workbook.write(out);
            out.close();
            byte[] data = out.toByteArray();
            return data;
        }
    }
    
  3. 配置:struts.xml

    <action name="excel" 
         class="cn.tedu.action.ExcelAction">
         <result  name="exl" type="stream">
            <param name="inputName">excel</param>
            <param name="contentType">
                application/vnd.ms-excel
            </param>
            <param name="contentDisposition">
                attachment;filename="hello.xls"
            </param>
         </result>
         <result name="error">
            /WEB-INF/jsp/error.jsp
         </result>
    </action>
    

    其中contentDisposition属性用于指定下载文件名

  4. 测试...

Json结果

Struts2利用插件支持了Json结果

<dependency>
  <groupId>org.apache.struts</groupId>
  <artifactId>struts2-json-plugin</artifactId>
  <version>2.5.12</version>
</dependency>

在插件中包含文件struts-plugin.xml

<package name="json-default" extends="struts-default">

    <result-types>
        <result-type name="json" class="org.apache.struts2.json.JSONResult"/>
        <result-type name="jsonActionRedirect" class="org.apache.struts2.json.JSONActionRedirectResult"/>
    </result-types>
    ...

在这个文件可以看出:json-default命名空间扩展了struts-default命名空间,扩展出新的结果类型json。只需要继承json-default就可以同时使用json-default和struts-default中全部的结果类型了。

默认情况下json类型结果:将控制器的全部属性序列化为JSON字符串发送到客户端。

原理


案例:

  1. 编写控制器

    public class JsonAction {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    
        public String execute(){
            name = "Tom";
            age = 5;
            return "json";
        }
    }
    
  2. 配置:

    <!-- 继承json-default才能使用json类型的
    Result -->  
    <package name="test" namespace="/test" extends="json-default">
        <!-- 默认情况下json Result将控制器
        的全部Bean属性序列化为JSON字符串发送
        到客户端 -->
        <action name="json" class="cn.tedu.action.JsonAction">
            <result name="json" type="json"/>
        </action>
    </package>
    
  3. 测试

Spring与Struts2整合

利用Spring作为工厂管理Struts2的控制器,可以利用Spring为控制器注入业务层组件,解决控制器依赖业务层组件问题:

步骤:

  1. 添加弹插件:

    <!-- 引入Spring, 将控制器对象的控制权
    交给Spring(IOC), 由Spring负责创建控制器
    对象,为控制器对象注入属性(业务层对象) -->
    <dependency>
      <groupId>org.apache.struts</groupId>
      <artifactId>struts2-spring-plugin</artifactId>
      <version>2.5.12</version>
    </dependency>
    
  2. 添加Spring配置文件:spring-struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans default-lazy-init="true"
        xmlns="http://www.springframework.org/schema/beans" 
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="  
           http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-4.1.xsd  
           http://www.springframework.org/schema/mvc   
           http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd   
           http://www.springframework.org/schema/tx   
           http://www.springframework.org/schema/tx/spring-tx-4.1.xsd   
           http://www.springframework.org/schema/context  
           http://www.springframework.org/schema/context/spring-context-4.1.xsd" >  
    
        <context:component-scan 
            base-package="cn.tedu.action"/>
    
    </beans>
    

    注意:配置文件的版本要与插件Spring的版本一致。

  3. 编写控制器,由Spring管理:

    @Controller// Bean ID: beanAction
    @Scope("prototype")
    public class BeanAction {   
        public String execute(){
            Thread t=Thread.currentThread();
            System.out.println(t); 
            System.out.println("Hello World!");
            return "success";
        }
    }
    

    为了解决线程安全问题使用@Scope( “原型”)

  4. 配置的struts.xml

    <!-- 使用Spring管理控制器Bean -->
    <action name="bean" class="beanAction">
        <result name="success">
            /WEB-INF/jsp/demo.jsp
        </result>
    </action>
    

    注意:当class =“beanAction”时候使用Spring Bean ID时候,就表示利用SPring管理控制器对象。

  5. 测试...

案例:

  1. 编写控制器类:

    @Controller
    @Scope("prototype")
    public class CurrnAction {
        String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    
        public String execute() throws Exception{
            Thread t = Thread.currentThread();
            Thread.sleep(10000);
            System.out.println(t); 
            System.out.println(name);
            return "success";
        }
    }
    
  2. 配置:struts.xml

    <action name="currn"
        class="currnAction">
        <result name="success">
            /WEB-INF/jsp/demo.jsp
        </result>
    </action>
    
  3. 测试

    当去掉@Scope(“prototype”)时候会出现线程并发安全问题。

过冬

Struts架子Hibernate冬眠春春天

过冬

  1. 不用写get set方法绑定参数
  2. 按照对象的方式操作数据库,可以忘记SQL
  3. 自动生成SQL,无需书写SQL
  4. 自动为不同数据库生成SQL,解决数据库差异问题。

休眠的理想是一切面向对象但是:

  1. 生成的SQL不够干练,不够简洁,性能有瑕疵。
  2. 虽然无需写SQL,但是需要学习HQL
  3. 实际开发中,数据库是重来不更换的!

使用休眠

  1. 导入Hibernate和数据库驱动:

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
      <version>4.3.9.Final</version>
    </dependency>
        <!-- 添加mysql驱动 (不要选5.1.6) -->
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.40</version>
    </dependency>
    
  2. 配置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>
            <property name="connection.driver_class">
                com.mysql.jdbc.Driver
            </property>
            <property name="connection.url">
                jdbc:mysql://localhost:3306/ssh
            </property>
            <property name="connection.username">
                root
            </property>
            <property name="connection.password">
                root
            </property>
            <!-- 方言: Hibernate利用方言生成不同数据
            的SQL语句. -->
            <property name="dialect">
                org.hibernate.dialect.MySQL5Dialect
            </property>
            <!-- 在控制台输出生成的SQL语句 -->
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <!-- 指定子配置文件的位置 -->
            <mapping resource="mapping/User.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>
    
  3. 编写SQL脚本,创建表

    create table t_user(
        t_id int,
        t_name varchar(100),
        t_age int,
        t_address varchar(200),
        primary key(t_id)
    )
    
  4. 创建实体类:

    public class User implements Serializable {
        private static final long serialVersionUID = -1655083559936102631L;
    
        private Integer id;
        private String name;
        private Integer age;
        private String address;
    
        public User() {
        }
    
        public User(Integer id, String name, Integer age, String address) {
            super();
            this.id = id;
            this.name = name;
            this.age = age;
            this.address = address;
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((id == null) ? 0 : id.hashCode());
            return result;
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            User other = (User) obj;
            if (id == null) {
                if (other.id != null)
                    return false;
            } else if (!id.equals(other.id))
                return false;
            return true;
        }
    
        @Override
        public String toString() {
            return "User [id=" + id + ", name=" + name + ", age=" + age + ", address=" + address + "]";
        }
    
    }
    
  5. 创建子配置文件User.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>
        <!-- User 类与 t_user 对应 -->
        <class name="cn.tedu.entity.User"
            table="t_user">
            <!-- User的ID属性对应表的t_id列 -->
            <id type="int" name="id" column="t_id"></id>
            <!-- 映射普通属性 -->
            <property name="name" column="t_name"/>
            <property name="age" column="t_age"/>
            <property name="address" 
                column="t_address"/>
        </class>
    </hibernate-mapping>
    
  6. 测试

    public class HbmTestCase {
        SessionFactory factory;
        Session session;
    
        @Before
        public void init(){
            Configuration cfg=new Configuration();
            //加载主配置文件
            cfg.configure("hibernate.cfg.xml");
            //创建工厂对象
            factory = cfg.buildSessionFactory();
            //创建Session对象
            session = factory.openSession();
        }
    
        @After
        public void destory(){
            //Session 使用以后务必关闭
            session.close();
            factory.close();
        }
    
        @Test
        public void testSave(){
            Transaction tx = 
                    session.beginTransaction();
            User user = new User(
                    1, "Tom", 5, "北京");
            session.save(user);
            tx.commit();
        }
    
    }



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值