1.首先先准备好 jdk1.7 linux 和tomcat7的安装包(这里使用的是jdk linux 32位的 文章底部奉上需要的安装包)
2. 将包文件拷贝到用户目录 我这里是 /home/rain/
3.解压 jdk文件 和tomcat文件
tar -zxvf a*****
4.打开 vim /etc/profile 在最后一行插入下面的数据
#set java environment
JAVA_HOME=/home/rain/jdk1.7.0_80
JRE_HOME=/home/rain/jdk1.7.0_80/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
注意需要将上面的/home/rain/** 目录替换成自己jdk的目录
5. 输入 source /etc/profile 刷新环境变量后 输入 java -version 查看控制台
如果显示当前数据表示jdk已经完成安装了
6.进入解压后的tomcat 目录中 找到bin目录并进入
直接在命令行输入 ./catalina.sh run 如果出现以下的信息表示启动完成了,直接通过浏览器访问 Http:xxx.xxx.xxx.xxx:8080/
本地有一个工程使用的是Eclipse maven构建的,由于需要将其移动到IDEA中开发,继而将导入步骤做出一下记录,方便查阅
第一步 打开IDEA checkout 源文件
本地需要先安装SVN工具 command line dient tools 必须安装 -> 传送门
选中一个目录 提取到该目录下面 (一般选择第二个) E:\idea_project\chouchou
直接导入Eclipse 模型 (maven 配置后面会自动检测) 一直下一步 下一步 是
如果导入的工程目录文件夹错误 ,
将工程导入到IDEA后 系统会在右下角提示这是一个maven 工程(不要急着构建maven工程 先将lib下面的 包引入到工程中) put into WEB-INF/lib 下面
点击右侧 导航条 的maven (此步骤可以省略)
打开项目结构 (导航栏上方按钮)
修改 SDK 我用的是jdk 1.7 及 非maven jar 包 导入
点击 jars 或目录
添加 Artifacts
查看刚才加入 的外部lib 有没有复制到 WEB-INF/lib/ 下面 如果没用 在右侧加入
打开设置 配置本地的maven
配置一个tomcat 就可以运行启动了
注意上述 完成 需要用 war exploded 来调试 文件发布 ,不要用war 包发布 ,修改 jsp之类的静态文件 不会自动更新
如果导入的工程文件 结构混乱
按下列步骤操作:
1. 关闭IDEA,
2.然后删除项目文件夹下的.idea文件夹
3.重新用IDEA工具打开项目
如果导入的工程 出现找不到配置文件 (resource)
项目的pom 文件需要 引入以下maven 配置支撑
<build>
<finalName>high-tech</finalName>
<plugins>
<!-- 更改maven默认的打包目录 -->
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webappDirectory>${basedir}/src/main/webapp</webappDirectory>
<warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>utf8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<includeScope>system</includeScope>
<outputDirectory>${basedir}/src/main/webapp/WEB-INF/lib</outputDirectory>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- spring的配置文件 一般写入数据源 事务控制 mybatis扫描 mapper 文件中 IOC控制器中 -->
<!-- 扫描service 层下面所有的 @Server 加入ICO容器中 -->
<context:annotation-config />
<context:component-scan base-package="com.rain.service" />
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="url" value="jdbc:mysql://localhost:3306/power?characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="3" />
<property name="minIdle" value="3" />
<property name="maxActive" value="20" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="validationQuery" value="SELECT 1" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="20" />
</bean>
<!-- mybatis 和spring 进行整合 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="typeAliasesPackage" value="com.rain.pojo" />
<property name="dataSource" ref="dataSource"/>
<!-- 指定mybatis mapper文件的地址 -->
<property name="mapperLocations" value="classpath:com/rain/mapper/*.xml"/>
<property name="plugins">
<array>
<!-- pagehelper -->
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的pagehelper方式配置参数,一行配置一个 -->
<value>
</value>
</property>
</bean>
</array>
</property>
</bean>
<!-- 配置扫描器 将 mybatis 接口的实现加入 ioc 容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描 该包路径下 所有 DAO接口的实现 加入 到 IOC容器中 -->
<property name="basePackage" value="com.rain.mapper"/>
</bean>
<!-- 配置spring的PlatformTransactionManager,名字为默认值 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 开启事务控制的注解支持 比较多的使用 xml配置形式的事务-->
<aop:config>
<!-- 切入点表达式 -->
<aop:pointcut expression="execution(* com.rain.service..*(..))" id="txPoint"/>
<!-- 事务增强 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/>
</aop:config>
<!-- 配置事务增强 如何切入 -->
<tx:advice id="txAdvice">
<tx:attributes>
<!-- 所有方法都是事务方法 -->
<tx:method name="*" />
<!-- 以get开始的所有方法 -->
<tx:method name="get*" read-only="true"/>
</tx:attributes>
<!-- spring配置文件核心点 数据源 与mybatis 整合 -->
</tx:advice>
</beans>
近期项目需要用到底层通讯的继而采用MQTT
之前已经搭建过MQTT 并且用websocket技术进行连接了 http://www.rainfly.cn/?post=285
在EMQTT官网下载 Windows 10 x64 位的包 后解压到目录下面 然后 运行起来
用本地通讯猫测试工具 检查是否开启正常!
在Maven中添加上相关依赖的包
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.0.2</version>
</dependency>
实现代码:打包下载 -> https://github.com/Rain-Fly/MQTT
三种方法
第一种:使用set方法注入
public class User {
private String name;
public void setName(String name) {
this.name = name;
}
}
User user = new User();
user.setName("abcd");
第二种 有参数构造注入
public class User {
private String name;
public User(String name) {
this.name = name;
}
}
第三种使用接口注入
interface Dao {
public void setName(String name);
}
public class DaoImpl implements Dao {
private String name;
public void setName(String name) {
this.name=name;
}
}
给编译器打印控制台添加彩色信息 官方文档 --》传送门
由于Intellij idea不支持显示ascii颜色,grep-console插件能很好的解决这个问题,下面就以开发JavaEE项目中,结合Log4j配置多颜色日志输出功能。
下载好上述压缩包,无需解压。
选择好ZIP文件 后会提示重新启动,当重启完成,插件安装成功后,设置log4j输出状态对应的颜色
剩下工作就是配置使用log4J 来提示文档
配置Log4j
Maven配置文件pom.xml添加log4j的信赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</version> </dependency>
在resource 文件夹添加log.4j的配置文件 log4j.properties 并添加如下内容
### set log levels ###
log4j.rootLogger = debug , stdout
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
测试最终效果
应用JUnit写如下测试代码
@Test
public void testLoger(){
final Logger logger = Logger.getLogger("TestErrOut");
logger.debug(" This is debug!!!");
logger.info(" This is info!!!");
logger.warn(" This is warn!!!");
logger.error(" This is error!!!");
logger.fatal(" This is fatal!!!");
}
Spring框架,IOC 实现原理 可以降低类与类之间的耦合性 解耦
applicationContext.xml 中对been进行配置
<bean id="userService" class="cn.rain.UserService" />
IOC DI工厂
通过 dom4j 对xml文件进行解析 根据id =userService 获得class对象
String classValue = "获得的class属性值"
使用反射创建类对象 ->>>传送门 (介绍反射)
通过class属性值获取类对象
Class clazz = Class.forName(classValue);
通过类对象创建 UerService对象
UserService service = clazz.newInstance();
返回创建好的对象
return service;
内容代码没有错误 但是项目出现错误,
先找到错误在哪。
Problems选项卡会有详细的错误描述。
如果被关闭了的话,重新打开方法:
Eclipse,选Window,Show View,Other,Problems。
反射的核心就是加载类,解剖出类的各个组成部分 例如:成员变量 、方法 、构造方法!
加载类的三种方法
/提取当前类的 Class 对象。
方法1
Class claszz1=Class.forName("com.rain.demo.Person");
方法2
Class claszz2=Person.class;
方法3
Class claszz3=new Hero().getClass();
解剖类的常用方法
//返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
public Constructor<T> getConstructor(Class<?>... parameterTypes)
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法
public Method getMethod(String name, Class<?>... parameterTypes)
//返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。
public Field getField(String name)
//私有
public Field getDeclaredField(String name)
//私有
public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
//返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定私有构造方法。
public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
反射功能实际作用是用来开发框架如:spring
实例
Person.java
package com.rain.demo;
public class Person {
public String name="123";
public Person(){
System.out.println("person");
}
public Person(String name){
System.out.println("person name");
}
public Person(String name,int password){
System.out.println("person name password");
}
public void getString(){
System.out.println(name);
}
}
Demo1.java
package com.rain.demo;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.junit.Test;
public class Demo1 {
//反射新建类的对象
@Test
public void test1() throws NoSuchMethodException, SecurityException, ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException{
Class claszzClass = Class.forName("com.rain.demo.Person");
Constructor c = claszzClass.getConstructor(null);
Person p = (Person)c.newInstance(null);
System.out.println(p.name);
}
@Test
public void test2() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{
//提取当前类的 Class 对象。
Class claszzClass1=Class.forName("com.rain.demo.Person");
//返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。
Constructor c =claszzClass1.getConstructor(String.class);
//使用此 Constructor 对象表示的构造方法来创建该构造方法的声明类的新实例,
Person p = (Person)c.newInstance("xxxx");
System.out.println("test2");
System.out.println(p.name);
}
@Test
public void test3() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
Person p = new Person();
Class claszzClass3=Class.forName("com.rain.demo.Person");
//
Method method = claszzClass3.getMethod("getString", null); //方法名 参数
method.invoke(p, null);
}
}
JSP动作元素在请求处理阶段实例化一个javaBean,并且提供了设置获取方法
在model中创建javaBean,(其实就是java中的类)关于此概念解释 -> 传送门
创建好Javabean 在jsp中请求调用的方法
在浏览器打开 http://127.0.0.1:8080/Test/person.jsp
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
由于常驻内存继而创建新的进程会出现资源的同步互斥现象;
Servlet: 同CGI程序 用来处理当前HTTP server交互数据
测试源码:
web.xml 文件中 指明项目访问路径 servlet-pattren 打开Tomcat 通过多开多个浏览器进行访问查看全局变量i的数值
全局变量在多线程访问时不断改变
需要将多个线程访问的资源加上锁,现在这种做法是给Servlet对象加了一把锁,保证任何时候都只有一个线程在访问该Servlet对象里面的资源,这样就不存在线程安全问题了
synchronized (this) { //Java中每个对象都有一把锁,这里的this指的就是servlet对象
response.setContentType("text/html");
i++;
String s=i+"";
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
response.getWriter().write(s);
}