萌新初次完整的搭建一个SSH框架,为自己写一个博客做一个记录,如果有什么需要补充的请联系我,我会尽快修改

同时学校也有一个测试就一并写了吧。

一、搭建框架

1.新建工程


创建工程时要选择我们需要使用的框架和服务器





idea 通过ssh 发布docker idea搭建ssh项目_idea 通过ssh 发布docker



点击Next等待依赖包下载完成


2.测试Spring


创建工程成功后我们来对添加的框架进行一些测试首先是Spring



(1).创建Spring配置文件


在目录web/Web-INF下创建Spring的配置文件applicationContext.xml文件


idea 通过ssh 发布docker idea搭建ssh项目_idea 通过ssh 发布docker_02


(2).创建测试


在src目录下新创建一个test包并在包下新创建TestService.java


代码如下


package test;

/**
 * Created by mengyan on 2017/4/25.
 */
public class TestService {
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }

    @Override
    public String toString() {
        return "TestService{" +
                "name='" + name + '\'' +
                '}';
    }
}


(3).配置Spring的配置文件


对applicationContext.xml进行如下配置


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean class="test.TestService" id="testService">
            <property name="name" value="Spring"></property>
        </bean>
</beans>

(4).尝试引用bean


现在测试一下能否正常引用刚才在Spring中的配置


在test包下创建Test.java


package test;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


/**
 * Created by mengyan on 2017/4/25.
 */
public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");
        TestService testService = (TestService)ac.getBean("testService");
        System.out.println(testService.toString());
        
    }d
}



运行后输出TestService{name='Spring'}就是正常的。

3.测试Hibernate

(1).引入额外依赖包


使用Hibernate有可能会用到额外的依赖包比如mysql-connector-java与commnons-dbcp和commons-pool


我们直接使用idea中的maven下载就好了,在FIle中找到project Structure,在里面找到Libraries然后点击左上方的加号选择From maven输入包名查找就好了


(2).创建持久化类


有表的话这里是可以使用persistence直接创建的,现在我们没有表就手动建一个持久化类,让Hibernate去给我们生成一个表吧


新建bean包在包下创建Emp.javas


package bean;


import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

/**
 * Created by mengyan on 2017/4/25.
 */
@Entity
@Table(name="t_emp",catalog = "test")
public class Emp {
    Integer id;
    String name;
    String pwd;
    @Id
    @GenericGenerator(strategy = "increment",name = "myi")
    @GeneratedValue(generator = "myi")
    @Column(name="e_id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Column(name = "e_name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }
    @Column(name = "e_pwd")
    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

(3).创建DAO


创建dao包在包下创建接口类EmpDao.java与实现类EmpDaoImpl.java,代码如下


EmpDao.java


package dao;

import bean.Emp;


/**
 * Created by mengyan on 2017/4/25.
 */
public interface EmpDao {
 
    public void add(Emp emp);
}

EmpDaoImpl.java


package dao;

import bean.Emp;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;



/**
 * Created by mengyan on 2017/4/25.
 */
public class EmpDaoImpl implements EmpDao{
    @Qualifier("sessionFactory")
    @Autowired
    public SessionFactory sessionFactory;

    @Override
    public void add(Emp emp) {
        Session s = sessionFactory.openSession();
        Transaction t =s.beginTransaction();
        s.save(emp);
        t.commit();
    }



    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

(4).将Hibernate的配置文件交给Spring托管



在applicationContext.xml中配置bean配置如下


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean class="test.TestService" id="testService">
            <property name="name" value="Spring"></property>
        </bean>

        <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
            <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
            <property name="username" value="root"></property>
            <property name="password" value="199689"></property>
        </bean>

        <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                    <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/test"</prop>
                    <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                </props>
            </property>
            <property name="annotatedClasses">
                <list>
                    <value>bean.Emp</value>
                   
                </list>
            </property>
        </bean>



        <bean id="empdao" class="dao.EmpDaoImpl">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>






</beans>

(5).进行测试


修改test包中的Test.java


代码如下


Test.java


package test;

import bean.Emp;
import dao.EmpDao;
import dao.EmpDaoImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


/**
 * Created by mengyan on 2017/4/25.
 */
public class Test {
    public static void main(String[] args) {
        ApplicationContext ac = new FileSystemXmlApplicationContext("web/WEB-INF/applicationContext.xml");

        EmpDao empDao = (EmpDaoImpl)ac.getBean("empdao");
        Emp emp = new Emp();
        emp.setName("99999999999");
        emp.setPwd("5555555");
        empDao.add(emp);
    }
}


运行后查看mysql数据库中是否添加数据


idea 通过ssh 发布docker idea搭建ssh项目_web_03


4.测试Struts2

(1).引入额外依赖包


方法与Hibernate相同,依赖包分别为struts-spring-plugin与spring-web和log4j


(2).修改web.xml


引入Struts2配置如下


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <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>

    
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>




</web-app>

(3).创建action


代码如下


package action;

import bean.Emp;
import com.opensymphony.xwork2.ActionSupport;
import org.springframework.beans.factory.annotation.Autowired;
import service.EmpDaoImpl;

/**
 * Created by mengyan on 2017/4/25.
 */
public class AddempAction extends ActionSupport{
    private String name;
    private String pwd;
    @Autowired
    private EmpDaoImpl empdao;


    public String add(){
        Emp emp = new Emp();
        emp.setName(getName());
        emp.setPwd(getPwd());
        empdao.add(emp);
        return SUCCESS;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public void setEmpdao(EmpDaoImpl empdao) {
        this.empdao = empdao;
    }
}

(4).为applicationContext.xml添加bean


为applicationContext.xml添加新的bean配置如下


<bean id="addempAction" class="action.AddempAction">
            <property name="empdao" ref="empdao"></property>
        </bean>

(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>  
    <!-- 将action托管给Spring -->  
    <constant name="struts.objectFactory" value="spring" />  
  
    <!--action的class属性不再是类,而是Spring配置文件配置的bean id-->  
    <package name="emp" namespace="/addemp" extends="struts-default">  
        <action name="add" class="addempAction" method="add">  
            <result name="success">/success.jsp</result>  
        </action>  
    </package>  
</struts></span>


(6).测试Struts2


在web目录下创建文件index.jsp与success.jsp


index.jsp


<%--
  Created by IntelliJ IDEA.
  User: mengyan
  Date: 2017/4/25
  Time: 上午2:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  index

  </body>
</html>

success.jsp


<%--
  Created by IntelliJ IDEA.
  User: mengyan
  Date: 2017/4/25
  Time: 上午2:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  success

  </body>
</html>


使用Tomcat运行程序,成功后在浏览器输入localhost:8080/addemp/add?name=10000&pwd=1111111


运行后查看数据库出现新数据则成功



二、校内的小测验

1.需要实现的效果


课上老师要求实现的效果是使用Struts2+Hibernate来实现下面这样的东西





idea 通过ssh 发布docker idea搭建ssh项目_idea_04



实际上应该还有一个登陆界面,文档里没给就不贴了,大概就是做一个登陆,需要登录之后才可以添加客户。


用Hibernate来实现数据的读写,用Struts2来实现界面的跳转、登陆验证与数据校验


2.创建jsp界面

(1).index.jsp


index界面就不写什么东西了写两个跳转按钮一个到登陆页面一个到添加客户界面


代码如下


index.jsp


<%--
  Created by IntelliJ IDEA.
  User: mengyan
  Date: 2017/4/25
  Time: 上午2:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>index</title>
  </head>
  <body>
  <table>
    <tr>
      <td><button οnclick="location.href='login.jsp'" >登陆</button></td>
      <td><button οnclick="location.href='success.jsp'">添加用户</button> </td>
    </tr>
  </table>


  </body>
</html>




实现效果



idea 通过ssh 发布docker idea搭建ssh项目_博客_05




(2).login.jsp


代码如下



login.jsp


<%--
  Created by IntelliJ IDEA.
  User: mengyan
  Date: 2017/4/25
  Time: 下午2:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆</title>
</head>
<body>

    <form action="loginaction.action" method="post">
        <table>
            <tr>
                <th>账号</th>
                <th><input type="text" name="name"></th>
            </tr>
            <tr>
                <th>密码</th>
                <th><input type="password" name="pwd"></th>
            </tr>
            <tr><td><input type="submit" value="登陆"></td></tr>

        </table>
    </form>

</body>
</html>

实现效果



idea 通过ssh 发布docker idea搭建ssh项目_idea_06




(3).success.jsp


在success页面下我们为了显示校验返回的错误会使用Struts2的标签库,但是有些标签自带了样式我们需要用theme=“simple”去除自带的样式


代码如下


<%--
  Created by IntelliJ IDEA.
  User: mengyan
  Date: 2017/4/25
  Time: 上午8:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>添加</title>
</head>
<body>

    <s:form action="addcompany">
        <table>
            <tr><th>${empname}</th></tr>
            <tr>
                <th>编号</th>
                <th><s:textfield name="no" theme="simple"></s:textfield> </th>
                <th><s:fielderror fieldName="no" theme="simple"></s:fielderror></th>

            </tr>
            <tr>
                <th>公司名称</th>
                <th><s:textfield name="name" theme="simple"></s:textfield></th>
                <th><s:fielderror fieldName="name" theme="simple"></s:fielderror> </th>
            </tr>
            <tr>
                <th>员工人数</th>
                <th><s:textfield name="number" theme="simple"></s:textfield></th>
                <th>
                    <s:fielderror fieldName="number" theme="simple"></s:fielderror>
                </th>
            </tr>
            <tr>
                <th>年销售额</th>
                <th><s:textfield name="sales" theme="simple"></s:textfield></th>
                <th><s:fielderror fieldName="sales" theme="simple"></s:fielderror></th>
            </tr>
            <tr>
                <th>公司邮箱</th>
                <th><s:textfield name="email" theme="simple"></s:textfield></th>
                <th><s:fielderror fieldName="email" theme="simple"></s:fielderror> </th>
            </tr>
            <tr>
                <th>成立日期</th>
                <th><s:textfield name="date" theme="simple"></s:textfield></th>
                <th><s:fielderror fieldName="date" theme="simple"></s:fielderror> </th>
            </tr>
            <tr><td><s:submit value="添加" theme="simple" ></s:submit></td></tr>

        </table>

    </s:form>
</body>
</html>

实现效果



idea 通过ssh 发布docker idea搭建ssh项目_ssh_07



3.功能实现


(1).实现login.jsp中的登录功能

(a).在Dao的借口类与实现类中添加login方法


代码如下


EmpDao.java


package dao;

import bean.Emp;

import java.util.List;

/**
 * Created by mengyan on 2017/4/25.
 */
public interface EmpDao {
    public List<Emp> login(String name,String pwd);
    public void add(Emp emp);
}

EmpDaoImpl.java


package dao;

import bean.Emp;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

import java.util.List;


/**
 * Created by mengyan on 2017/4/25.
 */
public class EmpDaoImpl implements EmpDao{
    @Qualifier("sessionFactory")
    @Autowired
    public SessionFactory sessionFactory;

    @Override
    public void add(Emp emp) {
        Session s = sessionFactory.openSession();
        Transaction t =s.beginTransaction();
        s.save(emp);
        t.commit();
    }

    @Override
    public List<Emp> login(String name,String pwd) {
        Session session = sessionFactory.openSession();
        Transaction t = session.beginTransaction();
        String HQL= "FROM Emp e WHERE =:name AND e.pwd=:pwd";
        Query query = session.createQuery(HQL);
        query.setParameter("name",name);
        query.setParameter("pwd",pwd);
        List<Emp> empList = query.list();
        t.commit();
        return empList;

    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}
(b).创建Action


在action包下创建EmpAction.java为了之后要写的拦截器我们在登陆成功时将name写入session


代码如下


package action;

import bean.Emp;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.sun.tools.javac.code.Attribute;
import dao.EmpDaoImpl;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * Created by mengyan on 2017/4/25.
 */
public class EmpAction extends ActionSupport{
    private String name;
    private String pwd;
    @Autowired
    private EmpDaoImpl empdao;

    public String LoginAction(){
        List<Emp> list= null;

        //System.out.println(name);
        //System.out.println(pwd);
        list = empdao.login(name,pwd);
        System.out.println(list);
        if(list.isEmpty()){
            return "error";
        }else {
            ActionContext.getContext().getSession().put("Constants_USER",name);
            return "success";

        }

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public void setEmpdao(EmpDaoImpl empdao) {
        this.empdao = empdao;
    }
}
(c).配置struts.xml与applicationContext.xml


在applicationContext.xml添加如下代码


<bean id="loginAction" class="action.EmpAction">
            <property name="empdao" ref="empdao"></property>
        </bean>

在struts.xml中配置action使其成功时跳转至success失败时跳转至index代码如下

<action name="loginaction" class="loginAction" method="LoginAction">
            <result name="success">/success.jsp</result>
            <result name="error">/index.jsp</result>
        </action>

(2).实现success.jsp中的添加功能


(a)创建持久化类


我们要添加的数据是新的一个表所以我们需要重新创建一个新的持久化类Company.java


代码如下


Company.java


package bean;

import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;
import java.util.Date;


/**
 * Created by mengyan on 2017/4/27.
 */
@Entity
@Table(name = "t_company",catalog = "test")
public class Company {
    private Integer id;
    private String no;
    private String name;
    private Integer number;
    private double sales;
    private String email;
    private Date date;
    @Id
    @GenericGenerator(strategy = "increment",name = "myi")
    @GeneratedValue(generator = "myi")
    @Column(name="c_id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
    @Column(name="c_no")
    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }
    @Column(name="c_name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }
    @Column(name="c_number")
    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }
    @Column(name="c_sales")
    public double getSales() {
        return sales;
    }

    public void setSales(double sales) {
        this.sales = sales;
    }
    @Column(name="c_email")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
    @Column(name="c_date")
    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public String toString() {
        return "Company{" +
                "id=" + id +
                ", no='" + no + '\'' +
                ", name='" + name + '\'' +
                ", number='" + number + '\'' +
                ", sales='" + sales + '\'' +
                ", email='" + email + '\'' +
                ", date='" + date + '\'' +
                '}';
    }
}
(b).配置applicationContext.xml


在交给Spring托管的SessionFactory的bean中添加这个持久化类


代码如下


<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
            <property name="dataSource" ref="dataSource"></property>
            <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <prop key="hibernate.hbm2ddl.auto">update</prop>
                    <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/test"</prop>
                    <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                </props>
            </property>
            <property name="annotatedClasses">
                <list>
                    <value>bean.Emp</value>
                    <value>bean.Company</value>
                </list>
            </property>
        </bean>
(c).创建CompanyDao


同之前测试Hibernate一样,分别创建接口类CompanyDao.java与实现类CompanyDaoImpl,java并写入save方法,代码如下



CompanyDao.java



package dao;

import bean.Company;

/**
 * Created by mengyan on 2017/4/27.
 */
public interface CompanyDao {
    public void save(Company company);
}

CompanyDaoImpl.java


package dao;

import bean.Company;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

/**
 * Created by mengyan on 2017/4/27.
 */
public class CompanyDaoImpl implements CompanyDao {
    @Qualifier("sessionFactory")
    @Autowired
    public SessionFactory sessionFactory;
    @Override
    public void save(Company company) {
        Session session = sessionFactory.openSession();
        Transaction t = session.beginTransaction();
        session.save(company);
        t.commit();
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}
(d).配置applicationContext.xml为dao注入SessionFactory

在applicationContext.xml中添加如下代码


<bean id="companydao" class="dao.CompanyDaoImpl">
            <property name="sessionFactory" ref="sessionFactory"></property>
        </bean>
(e).创建Action并配置applicationContext.xml与struts.xml


在action包下创建AddCompanyAction.java并写入如下代码


AddCompanyAction.java


package action;

import bean.Company;
import com.opensymphony.xwork2.ActionSupport;
import dao.CompanyDaoImpl;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;

/**
 * Created by mengyan on 2017/4/27.
 */
public class AddCompanyAction extends ActionSupport{
    private String no;
    private String name;
    private Integer number;
    private double sales;
    private String email;
    private Date date;
    @Autowired
    private CompanyDaoImpl companydao;


    public String add(){
        Company company = new Company();
        company.setNo(no);
        company.setName(name);
        company.setNumber(number);
        company.setSales(sales);
        company.setEmail(email);
        company.setDate(date);

        companydao.save(company);
        return "success";
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
         = name;
    }

    public Integer getNumber() {
        return number;
    }

    public void setNumber(Integer number) {
        this.number = number;
    }

    public double getSales() {
        return sales;
    }

    public void setSales(double sales) {
        this.sales = sales;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public void setCompanydao(CompanyDaoImpl companydao) {
        this.companydao = companydao;
    }
}

配置applicationContext.xml,由于Spring默认的scope是单例模式,这样只会创建一个Action对象,每次访问的都是一个,在大的项目里数据不安全,但在我们现在这个项目里会导致在数据校验时重复向addFieldError中保存信息,比如第一次提交时数据有问题提交了一条msg第二次你数据没有问题的时候再提交,虽然不会再次向addFieldError中保存信息但由于单例模式的原因你之前已经保存的信息还是会通过fielderror返回给你,所以我们需要设置scope="prototype"(多例模式)


向applicationContext.xml中添加如下代码


<bean id="AddCompanyAction" class="action.AddCompanyAction" scope="prototype">
            <property name="companydao" ref="companydao"></property>
        </bean>

配置struts.xml使其提交结束后跳转向index.jsp

<action name="addcompany" class="AddCompanyAction" method="add">
            <result name="success">/index.jsp</result>
        </action>



4.添加数据校验


根据要求我们将对success.jsp提交的数据进行数据校验在这里我们将使用框架进行数据校验


(1).创建验证文件


在与Action类相同的路径下创建文件<ActionClassName>-<ActionName>-validation.xml(Action类的名字-Action的名字-validation.xml)


在这里就是AddCompanyAction-addcompany-validation.xml


代码如下


AddCompanyAction-addcompany-validation.xml


<?xml version="1.0" encoding="UTF-8"?>
<!-- xwork校验器的DTD信息 -->
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
<validators>
    <field name="no">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>请输入编号</message>
        </field-validator>

        <field-validator type="stringlength">
            <param name="minLength">6</param>
            <param name="maxLength">8</param>
            <message>要求${minLength}-8位之间</message>
        </field-validator>
    </field>
    <field name="name">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>请输公司名称</message>
        </field-validator>
    </field>
    <field name="number">
        <field-validator type="conversion" short-circuit="true">
           <param name="repopulateField">true</param>
            <message>请输入整数!</message>
        </field-validator>
        <field-validator type="required">

            <message>请输入人数</message>
        </field-validator>

        <field-validator type="int">
            <param name="min">10</param>
            <param name="max">1000</param>
            <message>人数要求在${min}-${max}之间</message>
        </field-validator>
    </field>

    <field name="sales">
        <field-validator type="conversion" short-circuit="true">
            <param name="repopulateField">true</param>
            <message>请输入正确数值</message>
        </field-validator>
        <field-validator type="required">
            <message>请输入年销售额</message>
        </field-validator>
        <field-validator type="double">
            <param name="minInclusive">100000</param>
            <param name="maxInclusive">1000000</param>
            <message>要求在10万至100万之间</message>
        </field-validator>
        
    </field>
    
    <field name="email">
        <field-validator type="requiredstring">
            <param name="trim">true</param>
            <message>请输入邮箱</message>
        </field-validator>
        <field-validator type="email">
            <message>电子邮箱无效</message>
        </field-validator>
    </field>

    <field name="date">
        <field-validator type="conversion" short-circuit="true">
            <param name="repopulateField">true</param>
            <message>请输入合法日期</message>
        </field-validator>

        <field-validator type="required">
            <message>请输入日期</message>
        </field-validator>

    </field>



</validators>

在这里面其他的校验器都没有什么只有那个数据类型转换校验器让人很烦,当类型转换失败时会自动在addFieldError中添加一条“Invalid field value for field xxxx”这样的信息,当然这条信息是可以修改的只需要在Action类相同的目录下创建一个文件<ActionClassName>.properties在这里就是AddCompanyAction.properties在里面写下如下代码

invalid.fieldvalue.number=\u8bf7\u8f93\u5165\u6574\u6570

就会将Invalid field value for field number替换成等号后面的字符了,因为他无法直接读取中文所以你需要将中文转换成Unicode编码填写在等号后面

这样他自动添加你不想要的信息的状况就解决了但是还有一个问题,大家都知道<field-validator>下有两个东西一个是<param>有些可有可无,另一个是<message>必须要有,但这就出现了一个问题一旦类型转换出现了问题就会添加两条message进去,个人认为我自定义一个类型转换在类型转换里不为addFieldError添加信息理论上就能解决这个问题,但是还是想知道有没有什么其他的办法,如果有请联系我,我将进行补充。


(2).配置struts.xml


在数据校验校验到错误时他将跳转至input但是我们之前没有为addcompany设置input现在去struts.xml中设置一下


代码如下


<action name="addcompany" class="AddCompanyAction" method="add">
            <result name="success">/index.jsp</result>
            <result name="input">/success.jsp</result>
        </action>
    </package>




5.添加拦截器



(1).创建拦截器类


在src下创建interceptor包并在包下创建LoginInterceptor.java并继承AbstractInterceptor并实现intercept


在这里我们就用到了之前登陆成功时向session添加的Constants_USER
代码如下



package interceptor;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

import java.util.Map;

/**
 * Created by mengyan on 2017/4/28.
 */
public class LoginInterceptor extends AbstractInterceptor{
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        ActionContext ac = actionInvocation.getInvocationContext();
        Map session = ac.getSession();
        String user = (String) session.get("Constants_USER");
        if(user != null){
            return actionInvocation.invoke();
        }
        return "login";
    }
}


(2).配置struts.xml


接下来我们需要到struts.xml中去声明拦截器并使addcompany使用拦截器


所以我们需要在struts.xml中添加如下配置


声明拦截器


<interceptors>
            <interceptor name="loginI" class="interceptot.LoginInterceptot"></interceptor>
            <interceptor-stack name="mydefault">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="loginI"></interceptor-ref>
            </interceptor-stack>
        </interceptors>


使用拦截器并当用户没有登陆时跳转至login.jsp

<action name="addcompany" class="AddCompanyAction" method="add">
            <result name="success">/index.jsp</result>
            <result name="input">/success.jsp</result>
            <interceptor-ref name="mydefault"></interceptor-ref>
            <result name="login">/login.jsp</result>
        </action>

三、结语