`

【转】struts2+spring3.0+hibernate注解方式

 
阅读更多

最近用这三个东西开发了一个后台管理的程序,现在写出来希望能够讨论谈论,因为我刚开始弄有很多东西都还不知道,在这里写出来望大家发现到问题后能够给我留言,以便完善,呵呵~

第一步:导入工程需要的包,具体需要哪些包,如果有需要的话我可以提供,当然最好的就是去官网下载了,呵呵~

第二步:配置web.xml文件。我的web.xml文件如下:

[java] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  3.     <!-- 默认i18n资源文件 -->  
  4.     <context-param>  
  5.         <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>  
  6.         <param-value>i18n/messages</param-value>  
  7.     </context-param>  
  8.       
  9.     <!--  
  10.         Location of the Log4J config file, for initialization and refresh checks.  
  11.         Applied by Log4jConfigListener.  
  12.     -->  
  13.     <context-param>  
  14.         <param-name>log4jConfigLocation</param-name>  
  15.         <param-value>/WEB-INF/classes/log4j.properties</param-value>  
  16.     </context-param>  
  17.       
  18.     <filter>  
  19.         <filter-name>struts2</filter-name>  
  20.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  21.         <init-param>  
  22.             <param-name>actionPackages</param-name>  
  23.             <param-value>com.cssweb.tradeadmin.action.trade</param-value>  
  24.         </init-param>  
  25.     </filter>  
  26.   
  27.     <filter-mapping>  
  28.         <filter-name>struts2</filter-name>  
  29.         <url-pattern>/*</url-pattern>  
  30.     </filter-mapping>  
  31.       
  32.     <!-- 著名 Character Encoding filter -->  
  33.     <filter>  
  34.         <filter-name>encodingFilter</filter-name>  
  35.         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  36.         <init-param>  
  37.             <param-name>encoding</param-name>  
  38.             <param-value>UTF-8</param-value>  
  39.         </init-param>  
  40.     </filter>  
  41.   
  42.     <listener>  
  43.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  44.     </listener>  
  45.     <context-param>  
  46.         <param-name>contextConfigLocation</param-name>  
  47.         <param-value>/WEB-INF/applicationContext.xml</param-value>  
  48.     </context-param>  
  49.   
  50.     <!-- Spring 刷新Introspector防止内存泄露 -->  
  51.     <listener>  
  52.         <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
  53.     </listener>  
  54.       
  55.     <session-config>  
  56.         <session-timeout>30</session-timeout>  
  57.     </session-config>  
  58.       
  59.     <!-- Error Page定义 -->  
  60.     <error-page>  
  61.         <error-code>500</error-code>  
  62.         <location>/commons/error.jsp</location>  
  63.     </error-page>  
  64.     <error-page>  
  65.         <error-code>404</error-code>  
  66.         <location>/commons/404.jsp</location>  
  67.     </error-page>  
  68.     <error-page>  
  69.         <error-code>403</error-code>  
  70.         <location>/commons/403.jsp</location>  
  71.     </error-page>  
  72.       
  73.     <welcome-file-list>  
  74.         <!-- Redirects to "welcome.htm" for dispatcher handling -->  
  75.         <welcome-file>index.jsp</welcome-file>  
  76.     </welcome-file-list>  
  77.    
  78. </web-app>  

 

第三步:配置strust.xml文件(由于我用的是注解驱动方式,所以只有这一个文件)

[java] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.1.dtd">  
  5. <struts>  
  6.         <constant name="struts.custom.i18n.resources" value="globalMessages" />  
  7.         <constant name="struts.convention.package.locators" value="action" />   
  8.         <constant name="struts.i18n.encoding" value="UTF-8" />  
  9.         <!-- when you used to real please set false -->  
  10.         <constant name="struts.devMode" value="true" />  
  11.         <!-- 将struts2委托Spring管理 -->  
  12.         <constant name="struts.objectFactory" value="spring" />   
  13.           
  14.         <package name="mydefault" extends="struts-default">  
  15.               
  16.             <global-results>  
  17.                 <!-- 下面定义的结果对所有的Action都有效 -->  
  18.                 <result name="exception">/commons/error.jsp</result>  
  19.                 <result name="login">/login/login.jsp</result>  
  20.             </global-results>  
  21.   
  22.             <global-exception-mappings>  
  23.                 <!-- 指Action抛出Exception异常时,转入名为exception的结果。 -->  
  24.                 <exception-mapping exception="java.lang.Exception" result="exception"/>  
  25.             </global-exception-mappings>  
  26.         </package>   
  27.            
  28. </struts>  

 

第四步:配置spring的xml文件包含hibernate的引入

[java] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.         xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"  
  4.         xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"  
  5.         xmlns:aop="http://www.springframework.org/schema/aop"  
  6.         xsi:schemaLocation="  
  7.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  9.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd  
  10.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  11.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  12.       
  13.     <context:component-scan base-package="com.cssweb.tradeadmin.action"/>  
  14.       
  15.     <bean id="propertyConfigurer"  
  16.           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"  
  17.           p:location="/WEB-INF/jdbc.properties" />  
  18.       
  19.     <bean id="dataSource"  
  20.           class="org.springframework.jdbc.datasource.DriverManagerDataSource"  
  21.           p:driverClassName="${jdbc.driverClassName}"  
  22.           p:url="${jdbc.url}"  
  23.           p:username="${jdbc.username}"  
  24.           p:password="${jdbc.password}" />  
  25.       
  26.     <!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->  
  27.     <!-- Hibernate SessionFactory -->  
  28.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"  
  29.                 p:dataSource-ref="dataSource">  
  30.         <property name="hibernateProperties">  
  31.                 <props>  
  32.                         <prop key="hibernate.dialect">${hibernate.dialect}</prop>  
  33.                         <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>  
  34.                         <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>  
  35.                 </props>  
  36.         </property>  
  37.         <property name="mappingResources">  
  38.                 <list>  
  39.                     <value>com/cssweb/tradeadmin/model/UserBasicInfo.hbm.xml</value>  
  40.                     <value>com/cssweb/tradeadmin/model/LogLoginToday.hbm.xml</value>  
  41.                     <value>com/cssweb/tradeadmin/model/CustHostInfo.hbm.xml</value>  
  42.             </list>  
  43.         </property>  
  44.         <property name="eventListeners">  
  45.                 <map>  
  46.                         <entry key="merge">  
  47.                                 <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>  
  48.                         </entry>  
  49.                 </map>  
  50.         </property>  
  51.     </bean>  
  52.   
  53.     <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->  
  54.     <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"  
  55.                 p:sessionFactory-ref="sessionFactory"/>  
  56.   
  57.     <!-- Transaction manager that delegates to JTA (for a transactional JNDI DataSource) -->  
  58.     <!--  
  59.     <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>  
  60.     -->  
  61.   
  62.   
  63.     <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->  
  64.   
  65.     <!--  
  66.         Activates various annotations to be detected in bean classes:  
  67.         Spring's @Required and @Autowired, as well as JSR 250'@Resource.  
  68.     -->  
  69.     <context:annotation-config/>  
  70.   
  71.     <!--  
  72.         Instruct Spring to perform declarative transaction management  
  73.         automatically on annotated classes.  
  74.     -->  
  75.     <tx:annotation-driven/>  
  76.   
  77.     <!--  
  78.         Exporter that exposes the Hibernate statistics service via JMX. Autodetects the  
  79.         service MBean, using its bean name as JMX object name.  
  80.     -->  
  81.     <context:mbean-export/>  
  82.       
  83.       
  84.     <aop:aspectj-autoproxy/>  
  85.   
  86.     <!-- PetClinic's central data access object: Hibernate implementation -->  
  87.     <bean id="clinic" class="com.cssweb.tradeadmin.dao.hibernate.HibernateClinic"/>  
  88. </beans>  

 

第五步:在action包里面建action类:

[java] view plaincopy
  1. /** 
  2.  * Copyright 2010 CssWeb Microsystems, Inc. All rights reserved. 
  3.  * CssWeb PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. 
  4.  * 
  5.  * @(#)LoginAction.java 1:58:01 PM Apr 15, 2010 
  6.  */  
  7. package com.cssweb.tradeadmin.action;  
  8.   
  9. import java.util.List;  
  10. import java.util.Map;  
  11.   
  12. import javax.servlet.http.HttpServletRequest;  
  13.   
  14. import org.apache.commons.logging.Log;  
  15. import org.apache.commons.logging.LogFactory;  
  16. import org.apache.struts2.ServletActionContext;  
  17. import org.apache.struts2.convention.annotation.Action;  
  18. import org.apache.struts2.convention.annotation.Namespace;  
  19. import org.apache.struts2.convention.annotation.ParentPackage;  
  20. import org.apache.struts2.convention.annotation.Result;  
  21. import org.springframework.beans.factory.annotation.Autowired;  
  22. import org.springframework.context.annotation.Scope;  
  23. import org.springframework.stereotype.Controller;  
  24.   
  25. import com.cssweb.common.exception.BussinessException;  
  26. import com.cssweb.common.util.MD5;  
  27. import com.cssweb.tradeadmin.dao.Clinic;  
  28. import com.cssweb.tradeadmin.model.UserBasicInfo;  
  29. import com.opensymphony.xwork2.ActionContext;  
  30. import com.opensymphony.xwork2.ActionSupport;  
  31.   
  32. /** 
  33.  * 交易系统后台登录 
  34.  * 
  35.  * @author hujun 
  36.  * @version 1.0 
  37.  * @see 
  38.  * @since 1.0 
  39.  */  
  40. @Controller  
  41. @ParentPackage("mydefault")   
  42. @Namespace("/user")  
  43. @Scope("prototype")  
  44. public class LoginAction extends ActionSupport {  
  45.     /** 
  46.      *  
  47.      */  
  48.     private static final long serialVersionUID = 7454734463309586123L;  
  49.   
  50.     private Log log = LogFactory.getLog(LoginAction.class);  
  51.       
  52.     private final Clinic clinic;  
  53.       
  54.     private String loginName;  
  55.     private String loginPwd;  
  56.     private String incode;  
  57.       
  58.     @Autowired  
  59.     public LoginAction(Clinic clinic) {  
  60.         this.clinic = clinic;  
  61.     }  
  62.       
  63.     @Action(value="login",   
  64.             results={@Result(name="success", location="/index.jsp", type="redirect"),  
  65.                      @Result(name="input", location="/login/login.jsp")})  
  66.     public String login() {  
  67.         System.out.println(">>>>>>>>>>>>>>>>>>>>" + loginName);  
  68.         System.out.println(">>>>>>>>>>>>>>>>>>>>" + loginPwd);  
  69.         System.out.println(">>>>>>>>>>>>>>>>>>>>" + incode);  
  70.         String msg = "";  
  71.         try {  
  72.             Map session = ActionContext.getContext().getSession();  
  73.             String vnum = (String)session.get("vnum");  
  74.             if(vnum!=null&&!vnum.toLowerCase().equals(incode.toLowerCase())) {  
  75.                 msg="验证码不正确!";  
  76.             }  
  77.             else {  
  78.                 MD5 md5 = new MD5();  
  79.                 UserBasicInfo user = new UserBasicInfo();  
  80.                 user.setUserName(loginName);  
  81.                 user.setPassword(md5.getMD5ofStr(loginPwd));  
  82.                 List<?> list = this.clinic.queryList(user, 01nullfalse);  
  83.                 if(list!=null&&list.size()>0) {  
  84.                     session.put("userName", loginName);  
  85.                     session.put("password", loginPwd);  
  86.                 }  
  87.                 else {  
  88.                     msg="用户和密码不正确!";  
  89.                 }  
  90.             }  
  91.             HttpServletRequest request = ServletActionContext.getRequest();  
  92.             request.setAttribute("msg", msg);  
  93.         } catch (BussinessException e) {  
  94.             log.error(e);  
  95.         }  
  96.         System.out.println(">>>>>>>>>>>>##########" + msg);  
  97.         return msg.equals("") ? SUCCESS : "input";  
  98.     }  
  99.   
  100.     public String getLoginName() {  
  101.         return loginName;  
  102.     }  
  103.   
  104.     public void setLoginName(String loginName) {  
  105.         this.loginName = loginName;  
  106.     }  
  107.   
  108.     public String getLoginPwd() {  
  109.         return loginPwd;  
  110.     }  
  111.   
  112.     public void setLoginPwd(String loginPwd) {  
  113.         this.loginPwd = loginPwd;  
  114.     }  
  115.   
  116.     public String getIncode() {  
  117.         return incode;  
  118.     }  
  119.   
  120.     public void setIncode(String incode) {  
  121.         this.incode = incode;  
  122.     }  
  123. }  

 

 

第六步:hibernate类,在这里action中的Clinic是接口,hibernate类集成这个接口

[java] view plaincopy
  1. @Autowired  
  2. private SessionFactory sessionFactory;  
  3.   
  4.    /** 
  5.     * 保存(新建或者更新) 
  6.     */  
  7.    public void merge(Object obj) throws BussinessException {  
  8.        try {  
  9.            Session session = sessionFactory.openSession();  
  10.            Transaction t=session.beginTransaction();  
  11.            session.merge(obj);  
  12.            t.commit();  
  13.        }catch(RuntimeException e){  
  14.         log.error(e);  
  15.         throw new BussinessException(e);  
  16.        }  
  17.    }  
  18.      
  19.    /** 
  20.     * 保存(新建或者更新) 
  21.     */  
  22.    public void save(Object obj) throws BussinessException {  
  23.        try {  
  24.            Session session = sessionFactory.openSession();  
  25.            Transaction t=session.beginTransaction();  
  26.            session.save(obj);  
  27.            t.commit();  
  28.        }catch(RuntimeException e){  
  29.         log.error(e);  
  30.         throw new BussinessException(e);  
  31.        }  
  32.    }  
  33.      
  34.    /** 
  35.     * 保存(新建或者更新) 
  36.     */  
  37.    public void update(Object obj) throws BussinessException {  
  38.        try {  
  39.            Session session = sessionFactory.openSession();  
  40.            Transaction t=session.beginTransaction();  
  41.            session.update(obj);  
  42.            t.commit();  
  43.        }catch(RuntimeException e){  
  44.         log.error(e);  
  45.         throw new BussinessException(e);  
  46.        }  
  47.    }  
  48.    /** 
  49.     * 保存(新建或者更新) 
  50.     */  
  51.    public void saveOrupdate(Object obj) throws BussinessException {  
  52.        try {  
  53.            Session session = sessionFactory.openSession();  
  54.            Transaction t=session.beginTransaction();  
  55.            session.saveOrUpdate(obj);  
  56.            t.commit();  
  57.        }catch(RuntimeException e){  
  58.         log.error(e);  
  59.         throw new BussinessException(e);  
  60.        }  
  61.    }  

 

转自:http://blog.csdn.net/xiaojunhu/article/details/5500365

分享到:
评论

相关推荐

    搭建Struts2.1+Spring3.0+Hibernate3.3框架

    搭建Struts2.1+Spring3.0+Hibernate3.3框架是开发Java Web应用程序时常见的一种技术组合,也被称为SSH框架。这三个框架分别负责不同的职责:Struts2处理前端控制器,Spring提供依赖注入和事务管理,Hibernate则作为...

    struts1.2 + spring2.5 + hibernate3.2框架demo

    2. **配置文件**:struts-config.xml定义Struts的配置,spring-beans.xml管理Spring的bean,hibernate.cfg.xml配置Hibernate的数据库连接,可能还有实体类的映射文件(hbm.xml或使用注解)。 3. **JSP页面**:展示...

    Struts2+Spring3.0+MyBatis3.0平台搭建spring+json+gson+mysql,经典版本spring3.0+,完整架包

    标题中的"Struts2+Spring3.0+MyBatis3.0平台搭建"涉及到的是一个常见的企业级Java Web开发框架组合。这个平台基于Struts2作为MVC框架,Spring3.0作为核心容器,负责依赖注入(DI)和面向切面编程(AOP),而MyBatis...

    struts2.1+spring3.0+hibernate3.3整合小例子

    - 学习更多关于Struts2拦截器、Spring注解以及Hibernate高级查询技术等,以提升项目性能和可维护性。 - 探索不同数据库(如MySQL、SQL Server)的配置差异,增强自己的适应能力。 通过上述步骤和建议,开发者能够更...

    Struts2+Spring3.0+Hibernate开发问题总结+知识讲解

    Struts2、Spring3.0和Hibernate是Java Web开发中的三大框架,它们分别负责MVC模式中的Action层、业务逻辑层以及数据访问层。本文将深入探讨这三大框架的集成应用,常见问题以及解决策略,并提供相关的知识讲解。 1....

    struts1.3+spring3.0+hibernate3.3简单项目示例

    Struts1.3、Spring3.0和Hibernate3.3是经典的Java企业级开发框架组合,常被用于构建Web应用程序。这个"SSH"项目示例旨在帮助开发者理解如何将这三个框架整合并应用于实际项目中。下面我们将深入探讨这三个组件以及...

    Struts2+Spring3.0+MyBatis3.0

    Struts2、Spring3.0和MyBatis3.0是经典的Java Web开发框架组合,它们各自承担着不同的职责,协同工作以构建高效、灵活的应用系统。Struts2作为MVC(模型-视图-控制器)框架,负责处理HTTP请求并转发到相应的业务逻辑...

    struts1.2+spring2.3+hibernate3.0

    Struts1.2、Spring2.3 和 Hibernate3.0 是经典的Java企业级开发框架组合,被称为SSH(Struts-Spring-Hibernate)集成框架。这个组合在2000年代末到2010年初非常流行,它们各自解决了不同的问题,并通过相互配合,...

    struts2.2.3+spring3.0.1+hibernate3.6.5整合jar包

    Struts2、Spring和Hibernate是Java开发中三大主流框架,它们的组合被称为SSH(Struts2、Spring、Hibernate)集成,常用于构建企业级的Web应用程序。本篇将详细讲解这三个框架的核心概念、功能以及它们如何协同工作。...

    struts2.0+spring3.0+hibernate3.2框架整合Demo

    Struts2.0、Spring3.0和Hibernate3.2是Java Web开发中经典的三大框架,它们各自负责不同的职责,并通过整合实现高效、灵活的应用开发。这个Demo是开发者利用一个周末时间,结合网上找到的jar包,精心构建的SSH框架...

    OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)

    这个系统采用了经典的Java技术栈,包括Struts1.2、Hibernate3.0、Spring2以及DWR,这些都是Java开发中的核心框架。 Struts1.2是MVC(Model-View-Controller)设计模式的实现,它在Web应用中负责处理请求、控制业务...

    Struts2.0+Spring3.0+hibernate3.2 API(参考手册)

    Struts2.0、Spring3.0和Hibernate3.2是经典的Java企业级开发框架组合,通常被称为SSH(Struts2、Spring、Hibernate)架构。这个API参考手册提供了这三个框架的核心概念、用法和功能的详细说明。 Struts2.0是MVC...

    MyEclipse8.6+Struts2.1+Spring3.0+Hibernate3.3环境搭建.doc

    本文档主要介绍了如何在MyEclipse 8.6环境中搭建一个基于Struts2.1、Spring3.0和Hibernate3.3的Java Web应用开发环境。以下是各个部分的详细说明: 1. 创建Web Project项目 在MyEclipse中创建Web Project是开始...

    struts2+hibernate3.3+spring3.0整合实例

    Struts2、Hibernate3.3和Spring3.0是Java Web开发中著名的三大框架,它们分别负责MVC模式中的Action层、持久化层和依赖注入与业务逻辑管理。本实例将详细阐述如何将这三个框架整合在一起,实现一个完整的CRUD(创建...

    最新版本Struts2.1.8+Spring3.0+Hibernate3.3.2+DWR2.0.6配置

    ### 最新版本Struts2.1.8+Spring3.0+Hibernate3.3.2+DWR2.0.6配置详解 在本篇内容中,我们将详细探讨如何搭建一个基于Struts2.1.8、Spring3.0、Hibernate3.3.2以及DWR2.0.6的Web应用程序框架。这一组合被称为SSH+...

    Struts2.1+Spring3.0+JPA1.0(Hibernate3.3实现)例子

    ### Struts2.1+Spring3.0+JPA1.0(Hibernate3.3实现)集成案例解析 #### 概述 本篇文章主要介绍如何将Struts2.1、Spring3.0以及JPA1.0(通过Hibernate3.3实现)进行集成开发的应用案例。这种集成方式在企业级应用开发...

    struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版

    struts2+spring2.5+hibernate3.2 + freemarker 全新功能实现的增删改查+freemarker 摸版 struts2 的方式自己去看简单。 spring2.5 是用注释来注入 hibernate3.2 是用ejb3注解映射关系 hibernate3 +个属性可以自动...

    新版SSH+DWR配置(Struts2.1.8+Spring3.0+Hibernate3.3.2+DWR2.0.6).doc

    本文将详细介绍如何配置新版SSH+DWR框架,即Struts2.1.8、Spring3.0和Hibernate3.3.2与Direct Web Remoting (DWR) 2.0.6的集成。这个配置示例是基于目前最新的技术栈,旨在提供一个高效、稳定的开发环境。 首先,...

    ssh框架demo Struts2.0+Spring3.0+hibernate

    SSH框架,全称为Struts2、Spring和Hibernate的组合,是JavaWeb开发中经典且流行的MVC(Model-View-Controller)架构模式的实现。这个SSH框架Demo项目展示了如何将这三个框架集成到一起,用于构建一个简单的登录注册...

    Struts2+Spring4+Hibernate5整合

    Struts2、Spring4和Hibernate5是Java Web开发中的三个重要框架,它们分别负责MVC模式中的动作控制、依赖注入和持久化管理。这三者的整合可以构建出高效、稳定且易于维护的企业级应用。 **Struts2** 是一个基于MVC...

Global site tag (gtag.js) - Google Analytics