• SSH配置与讲解


    一、Struts

     首先介绍Struts,在web项目中加入Struts的jar包,并在Web.xml中添加Struts的配置:

    <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>

     

    其中filter是指户请求的截,url-pattern中的/*是指使用Struts所有的截。接着建一个Login.jsp,源如下

     

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <%@ page isELIgnored="false" %>

    <%@ taglib uri="/struts-tags" prefix="s"%> 

     

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

    <html>

     

      <head>

        <title>用户登录</title>

        <meta http-equiv="pragma" content="no-cache">

        <meta http-equiv="cache-control" content="no-cache">

        <meta http-equiv="expires" content="0">   

      </head>

     

      <body>

          <s:form action="Login.action" method="post">

            <s:textfield name="UserName" label="帐号">

              </s:textfield>

     

              <s:password name="Password" label ="密码">

              </s:password>

              <s:submit value="登录"></s:submit>

          </s:form>

     </body>

    </html>

    其中的【s:】的的标签是由Struts标签库提供的,Struts中提供了一个非常大的标签库,利用标签库可以助开HTML的表单设计和一些业务逻辑控制,form标签中的action指向的是我的控制器,默是以.action尾,我添加一个控制器,用于理用的登录请求,命名Login.java,如下

    package account;

    import com.opensymphony.xwork2.Action;

    import com.opensymphony.xwork2.ActionSupport;

    public class Login extends ActionSupport {

        public String UserName;

        public String Password;

        public String getUserName() {

            return UserName;

        }

        public void setUserName(String userName) {

            UserName = userName;

        }

        public String getPassword() {

            return Password;

        }

        public void setPassword(String password) {

            Password = password;

        }

        //对表单进行验证

        @Override

        public void validate() {

            if(UserName.equals(""))

            {

                this.addFieldError("UserName", "用户名不允许为空!");

            }

            if(Password.equals("")){

                this.addFieldError("Password", "密码不能为空!");

            }

        };

        //执行控制器逻辑

        public String execute()

        {

            if(UserName.equals("admin") && Password.equals("123")){

                return Action.SUCCESS;

            }

            else {

                return Action.ERROR;

            }

        }

    }

     

    其中Login的类继承自ActionSupportActionSupport类实现了StrutsAction的接口,并且还具有了对表单进行验证的功能,在Login中重写alidate就可以对表单进行验证,在出错的时候,添加错误信息。execute相当于控制器的“main”函数,其必须为public类型,并且返回值为String,在本例中返回的结果为Action中的5个字符常量之一(当然,也可以自定义返回接口)。

        接下来在src的目录下对struts.xml添加相应的配置,把控制器和我们的jsp文件关联起来,配置的代码如下:

     

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
    <package name="ghyStruts" extends="struts-default">
    <action name="Login" class="account.Login">
        <result name="success" type="redirectAction">
        <param name="username">${UserName}</param>
        <param name="actionName">index</param>
        </result>
        <result name="error">/error.jsp</result>
        <result name="input">Login.jsp</result>
    </action>
     
    <action name="index" class="home.index">
        <result name="index">/index.jsp</result>
    </action>
    </package>
    </struts>    

     

     

    其中的action代表了一个控制器求,result是指求返回的果(控制器中的execute方法的返回),其中的name与返回的字符串必对应起来,type="redirectAction"代表跳到另外一个action中,可以在跳候,添加参数,参数的名称、和跳转结果的action的名字都是由param指定。如果需要直接返回到另外一个jsp面,可以直接在result中添加jsp的名字,如/error.jsp,其中的“/”代表根目

         Struts中提供了大量的标签库标签库中的所有的标签头都是以s,格式s:xxx,以其中的控制标签if例:

     

    <s:if test="UserName=='admin'">您好,管理</s:if>
    <s:else>您好,普通用!</s:else>

     

    其中test是判断条件,UserName控制器返回的属性,里面的内容是条件

       二、Spring

        下面来介一些Spring框架实现的IoC,首先添加一个接口IService,代如下:

    package lizon;

     

    public interface IService {

        public void save();

    }

        再添加一个Service类实现该接口:

     

    package service;

     

    import lizon.IService;

     

    public class Service implements IService {

        public void save() {

            System.out.println("保存");

        }

    }

     

        添加一个Run,来用接口的save

     

    package lizon;

     

    import org.springframework.context.ApplicationContext;

    import org.springframework.context.support.ClassPathXmlApplicationContext;

     

    import service.Service;

     

    public class Run {

        private IService isvc;

        public IService getIsvc() {

            return isvc;

        }

        public void setIsvc(IService isvc) {

            this.isvc = isvc;

        }

        public static void main(String[] args) {

           

        }

    }

     

        注意,我的Run中有一个IService接口的属性,接下来,我Spring的配置,把Service注入到IService中:

     

    <?xml version="1.0" encoding="UTF-8"?>

    <beans

        xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xmlns:p="http://www.springframework.org/schema/p"

        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

     

        <bean id="svc" class="service.Service">

        </bean>

       

        <bean id="run" class="lizon.Run">

            <property name="isvc" ref="svc"></property>

        </bean>

    </beans>

     

        首先配置一个Service的bean,并它的例起个名字叫svc,然后配置一个run的bean,并把svc的实现,注入到Run中的IService接口中。这样Runmain方法中,我就可以这样调用:

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

    Run run = (Run) context.getBean("run");

    run.isvc.save();

        ApplicationContext得配置文件中的接口的实现,然后用。在我Run方法中没有涉及到任何实现的代,有效地接口和实现进行了解耦。Spring框架可以注入多种数据型,包括基本数据型、null型、ListMapSet等,可以构造函数行注入。并且在配置文件中改scope的属性,可以松地实现单例模式(Singleton)或多例模式(Prototype)。

        Spring有另一个擅域:AOP,下面来介一下在SpringAOP实现方法,借用上面例子中的接口和实现,代如下:

    package lizon;

     

    public interface IService {

        public void save();

    }

     

    package service;

     

    import lizon.IService;

     

    public class Service implements IService {

        public void save() {

            System.out.println("保存");

        }

    }

     

        假如个接口和实现是我中多年前完成的功能模在我想在save方法中加入行前后的日志,但是根据设计修改关对扩展开放的原,我应该直接修改save方法,而是使用AOPsave方法展,下面定一个基于Spring方法行增

     

    package Interceptor;

     

    import org.aopalliance.intercept.MethodInterceptor;

    import org.aopalliance.intercept.MethodInvocation;

     

    public class mylog implements MethodInterceptor{

     

        @Override

        public Object invoke(MethodInvocation arg0) throws Throwable {

            System.out.println("方法行前");

            arg0.proceed();

            System.out.println("方法行后");

            return null;

        }

     

    }

     

        个mylog的类继承自Spring中的MethodInterceptor,并重写了该类中的invoke方法,其中arg0.proceed()是行被代理的方法,并在行的前后加入了自定的日志,最后我配置一个Spring,让这个增的方法和原方法关起来:

     

    <?xml version="1.0" encoding="UTF-8"?>

    <beans

        xmlns="http://www.springframework.org/schema/beans"

        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        xmlns:p="http://www.springframework.org/schema/p"

        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

     

        <bean id="svc" class="service.Service">

        </bean>

       

        <bean id="mylog" class="Interceptor.mylog"></bean>

       

        <bean id="myproxy" class="org.springframework.aop.framework.ProxyFactoryBean">

            <property name="proxyInterfaces">

                <value>lizon.IService</value>

            </property>

           

            <property name="target" ref="svc"></property>

           

            <property name="interceptorNames">

                <list>

                <value>mylog</value>

                </list>

            </property>

        </bean>

     

    </beans>

     

        个配置文件中,首先定了接口的实现svc和代理mylog,然后配置代理的接口,proxyInterfaces里面的value是我需要增的接口,target中的ref是接口的实现,interceptorNames中配置我使用哪一个代理用方法如下:

    public static void main(String[] args) {

            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

            IService isvc = (IService) context.getBean("myproxy");

            isvc.save();

        }

        三、Hibernate

        最后介一下Hibernate,首先用数据脚本建一个User表:

     

    CREATE TABLE USER

    (

        USERID INTEGER NOT NULL PRIMARY KEY,

        USERNAME VARCHAR(12) NOT NULL,

        PASSWORD VARCHAR(50)

    );

     

        接着建一个User:

     

    package lizon;

    public class User {

        private int userid;

        private String username;

        private String password;

        public int getUserid() {

            return userid;

        }

        public void setUserid(int userid) {

            this.userid = userid;

        }

        public String getUsername() {

            return username;

        }

        public void setUsername(String username) {

            this.username = username;

        }

        public String getPassword() {

            return password;

        }

        public void setPassword(String password) {

            this.password = password;

        }   

    }

     

        建一个User.hbm.xmlUserUSER表关起来:

     

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE hibernate-mapping PUBLIC

            '-//Hibernate/Hibernate Mapping DTD 3.0//EN'

            'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'>

    <hibernate-mapping>

        <class name="lizon.User" table="USER">

            <id name="userid" column="USERID">

                <generator class="increment"/>

            </id>

            <property name="username" column="USERNAME"></property>

            <property name="password" column="PASSWORD"></property>

        </class>

    </hibernate-mapping>

     

        添加一段代看一下Hibernate是怎么跟数据交互的:

     

    package lizon;

    import hb4.HibernateSessionFactory;

    import org.hibernate.Session;

    public class Run {

        public static void main(String[] args) {

            Session session = null; 

            try

                //取得Session

                session = HibernateSessionFactory.getSession(); 

                //开启事务处

                session.beginTransaction(); 

                //新增一个User,这时象是瞬

                User user = new User();

                user.setUsername("lizon"); 

                user.setPassword("123"); 

                //保存User象 ,这时象是持久化状

                session.save(user); 

                //提交事 

                session.getTransaction().commit(); 

            }catch(Exception e){ 

                e.printStackTrace(); 

                // 

                session.getTransaction().rollback(); 

            }finally

                if(session != null){ 

                    if(session.isOpen()){ 

                        //session这时候的象是游离状

                        session.close(); 

                    } 

                } 

            } 

        }

    }

     

        段代中,我首先例化了一个新的User象,然后使用HibernateSession象保存到了数据,甚至包含了一个事务处理,在,我没有使用任何的sql句,仅仅对User行操作就可以持久化到数据,使用Hibernate减少了大量的重复JDBC的代,可以更好地实现面向象的程,当然,里介的只是Hibernate的冰山一角,由于篇幅有限,Hibernate的外、延HQL等有趣的可以自行学

     

  • 相关阅读:
    多端统一框架Taro基础教程
    golang中的race检测
    【Golang】高性能编程之超时退出协程
    电容充放电时间常数RC计算方法(转)
    meanshift算法详解(转)
    vim 统计字符串在当前文档中出现的次数
    置信区间的理解
    IC 后端仿真: process corner 和 PVT (转)
    STA概念:一文了解NLDM与CCS(转)
    Linux 中 fg、bg、jobs 等指令(转)
  • 原文地址:https://www.cnblogs.com/TrustBelieve/p/5911433.html
Copyright © 2020-2023  润新知