rose学习总结(及配置)

谷梁宝
2023-12-01

1.rose 整体认识
人人网、糯米网释出的、开源的高效Java web开发框架。在小米米聊服务端再次被验证和使用。一个从零开始的创业公司,在大家技术背景不一的情况下,rose很简
单快速地传达到了大家中间。本手册致力于让php开发人员也能快速使用上java开发高性能服务
l 基于IoC容器 (使用Spring 2.5.6).
l 收集最佳实践,形成规范和惯例,引导按规范惯例,简便开发.
l 收集通用功能,形成一些可使用的组件,提高生产效率.
l 特性的插拔,使用基于组合而非继承的设计.
l 提供可扩展的点,保持框架的可扩展性.
l 注重使用简易性的同时,注重内部代码设计和实现.

1.1B/S web开发

我们所做的web开发是基于HTTP的应用服务开发,主要由两部分组成:浏览器+服务端

大致流程为:浏览器向服务端发送HTTP请求,获取服务器IP,建立TCP连接,发送请求

服务器侦听请求,侦听到请求,建立起连接,处理然后返回响应消息

1.2Rose框架

初始化:

Tomcat启动时,会读取配置文件,进行服务的初始化工作
而对于rose,会进行两个主要的初始化工作:

一个是:对于各个要使用的Bean进行实例化。包括controller、dao等

另一个是:构建匹配树。这是rose解析用户请求并进行匹配处理的基础

rose框架里面包含的思想:

资源封装:对底层资源的封装,开发者不用考虑servlet实现,doGet/doPost,数据库连接等底层实现,可以更加专注于业务逻辑的分析和处理

分层设计:rose框架本身就包含了分层的概念,资源封装,通过提供接口

   我们在开发的时候也应该注意分层的概念,合理设计。页面,controller,service,jade层间设计与关联

匹配机制:rose匹配树,实际为所定义的controller URL树。客户请求及响应实为与相关的controller间的交互 .

Rose运行机制:

Rose解析客户的请求地址,从匹配树中寻找匹配的controller

寻找到相匹配的controller,如若存在拦截器注解,则还会先进行拦截器的处理,然后再传给controller,(ps:拦截器收到的url为请求被拦截的请求的 url,return null继续执行url)

如果在匹配树中无法再到相匹配的controller,则会返回404的错误

IOC、依赖注入概念:

基本概念:程序运行过程中,当需要用到相关的对象时,动态的注入该对象,来执行对象方法,改变对象属性。

具体怎么实例化这个对象,对象生命周期的管理等,均由框架来自动管理

而Rose提供了非常便利的@ 注解使用方式,让开发者可以方便的使用相关的类及类方法(ps:@Param对java自带类型使用,自定义对象不用@param,如String f1(@Param(“x”) int x),String f2(User user) ;)
这里的IOC概念,相当于是对java垃圾回收的延伸

因为有垃圾回收的特性,才能够使对象生命周期的自动管理得以实现

小结:Rose框架本身维护着一个主‘进程/线程’,在初始化阶段会实例化相关的对象。

然后运行过程通过对客户端请求地址的解析,调用相匹配的对象方法进行处理,而这部分的实现代码则由框架进行封装维护

开发者只需要根据业务开发实现相关功能的类即可(封装)

2 基于rose框架的开发

2.1web开发——web服务端开发

 我们所开发的web服务主要是服务端的服务,其包括三个部分:

 Views:用户提交请求,同时呈现响应信息:jsp

业务逻辑处理:controller、service  

数据持久化:mysql、jade

Rose框架其实是一套规则,我们就是利用这套规则,来进行快速高效的web服务开发
(1)controller bean的定义规则:

1需在controllers package下进行controller类的定义

2controller类都需要以controller为后缀

(2)数据持久化:

数据库的操作采用rose jade
使用规则:

1定义数据库操作的DAO接口,并使用@Dao标注

2使用@SQL(:1,:2表示第一、第二个参数,@SQLParam按变量名,如:name)标注并定义相关的sql语句作为该注解的值

3定义相关的sql方法接口作为调用实体

与匹配相关的问题

rose在运行过程中,客户请求处理首要过程就是进行对请求地址的解析
在开发中常出现匹配异常:

可以注意是否定义相对应的get 或 post的controller方法

是否定义与url相对应的controller或者方法
开发过程:

通过使用@Path @Get @Post可以对controller类的url地址进行设置

@get @post则可以配置相关get post方法

注意参数获取的对应url地址

2.2 controller的深入

对于交互,即在与页面端的数据传输中:

Controller是在方法中通过@Param 参数的方式来获取提交的数据,或者可以在方法中通过getParameter的方法来获取

页面端向后端传递数据的方式有两种:

1在映射地址上直接传递数据

2可以通过表单等方式传递到对应变量中,如果传递的是bean数据,页面传递的数据会自动封装到bean里

Controller要返回相关的数据,则通过Invocation变量进行传输

可以采用addModel和setAuttribute的方法

Controller功能分析:

根据rose匹配运行的机制,我们知道,controller其实是直接与用户进行交互的

获取用户提交的数据,同时返回响应的信息

因此,在设计controller bean的时候则要符合业务逻辑处理,即controller间的职责需要明确 ,一个controller对应一个业务处理块

Controller主要是获取页面提交数据,返回响应信息,作为一个信息的中转站

业务逻辑的处理可以由service层进行处理,并由controller进行调用

定义各个业务逻辑处理的service类,具体的编写规则:

1定义service类接口

2定义service类的实现

3在要运用的类bean上标注@Autowired注解,则rose框架会自动实例化注入该对象

other question

对于数据库的操作,要注意sql语句的设计

不要把业务逻辑的处理带到sql语句中

Sql语句要原子化,业务处理由负责业务逻辑处理的service层进行考虑

配置

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.54chen</groupId>
    <artifactId>rose-example2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>


    <dependencies>
        <dependency>
            <groupId>com.54chen</groupId>
            <artifactId>paoding-rose-scanning</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.54chen</groupId>
            <artifactId>paoding-rose</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.54chen</groupId>
            <artifactId>paoding-rose-portal</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>com.54chen</groupId>
            <artifactId>paoding-rose-jade</artifactId>
            <version>1.1</version>
        </dependency>
        <!-- dbcp -->
        <dependency>
            <groupId>conmmos-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.10</version>
        </dependency>
        <dependency>
            <groupId>com.54chen</groupId>
            <artifactId>bmwutils</artifactId>
            <version>0.0.2</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <includes>
                    <include>**/*.*</include>
                </includes>
            </resource>
        </resources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <webResources>
                        <resource>
                            <targetPath>WEB-INF</targetPath>
                            <filtering>true</filtering>
                            <directory>src/main/resources</directory>
                            <includes>
                                <include>**/*.xml</include>
                                <include>**/*.properties</include>
                            </includes>
                            <targetPath>WEB-INF</targetPath>
                        </resource>
                    </webResources>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <fork>true</fork>
                    <verbose>true</verbose>
                    <encoding>UTF-8</encoding>
                    <compilerArguments>
                        <sourcepath>
                            ${project.basedir}/src/main/java
                        </sourcepath>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <!-- 忽 略测试 -->
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

applicationContext.xml

<?xml version="1.0" encoding="gbk"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    default-lazy-init="true">
    <!-- 自动扫描 -->
    <context:annotation-config />
    <context:component-scan base-package="com.chen">
    </context:component-scan>

    <!-- 配置数据源 -->
    <bean id="jade.dataSource.com.chen.dao" class="org.apache.commons.dbcp2.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url"
            value="jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&amp;characterEncoding=utf-8"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
        <!-- 运行判断连接超时任务的时间间隔,单位为毫秒,默认为-1,即不执行任务。 -->
        <property name="timeBetweenEvictionRunsMillis" value="3600000"></property>
        <!-- 连接的超时时间, 默认为半小时。 -->
        <property name="minEvictableIdleTimeMillis" value="3600000"></property>
    </bean>

    <!-- 配置分表规则 -->
    <bean id="jade.routerInterpreter"
        class="com.xiaomi.common.service.dal.routing.RewriteSQLInterpreter">
        <property name="routingConfigurator" ref="jade.routingConfigurator" />
    </bean>
    <bean id="jade.routingConfigurator"
        class="com.xiaomi.common.service.dal.routing.RoutingConfigurator">
        <property name="partitions">
            <list>
                <value>hash:test:id:test_{0}:100</value>
            </list>
        </property>
    </bean>

</beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>rose-example</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.xml</param-value>
    </context-param>

    <context-param>
        <param-name>portalExecutorCorePoolSize</param-name>
        <param-value>5</param-value>
    </context-param>


    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>

<!-- 
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.chen.interceptor.LoginInterceptor</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
 -->

    <filter>
        <filter-name>roseFilter</filter-name>
        <filter-class>net.paoding.rose.RoseFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>roseFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
    </filter-mapping>



</web-app>

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-4r [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>

    <root>
        <priority value="debug"/>
        <appender-ref ref="console"/>
    </root>

    <logger name="org.apache.zookeeper.ClientCnxn">
        <level value="error"/>
    </logger>
</log4j:configuration>
 类似资料: