发表于: 2017-10-04 20:34:59
1 808
今日完成:
使用maven建立web项目,并部署至tomcat服务器进行测试。详细步骤如下,http://www.cnblogs.com/yjqc/p/6590565.html
这里就十分有意思在访问地址时,并不像之前的使用http://localhost:8080/项目名/名称空间,在对项目不加任何名称空间时
maven项目直接覆盖原来的tomcat主地址http://localhost:8080/,从而对web项目直接访问,真滴是相当的方便,即使修改如
在访问tomcat主地址http://localhost:8080/ 会404报错,那么OK,将这简单的hello world 项目上传到服务器,我们从本地进行访问,这里需要将解压好的war压缩文件,上传到Tomcat的webapps下,启动tomcat的startup.bat,会自动解压项目,
但是不使用其他插件下直接访问项目地址为http://localhost:8080/项目名 也就是你文件夹的名字,这里太长了我就复制了这个项目取名为test,在服务器内自己访问自己,进行测试!没问题,从本地电脑上访问迟迟不行,
那么说明我服务器的端口没有开放,去阿里云服务器核对开放端口,果然。
那么去服务器下找到tomcat安装包下的conf文件夹下的server.xml文件;
找到Connector节点;
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- redirectPort="8443" />
我们把port="8080"改成80端口即可,因为我们服务器中的80端口是向所有外网IP开放的,这样我们就可以不用端口了。不加端口就是默认访问80端口;
我们在最后 找到Host节点:
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- <!-- SingleSignOn valve, share authentication between web applications
- Documentation at: /docs/config/valve.html -->
- <!--
- <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
- -->
- <!-- Access log processes all example.
- Documentation at: /docs/config/valve.html
- Note: The pattern used is equivalent to using pattern="common" -->
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" />
- </Host>
我们在里面加一个节点:
<Context path="" docBase="C:\apache-tomcat-8.5.23\webapps\test" debug="0" reloadable="true" />
- <Host name="localhost" appBase="webapps"
- unpackWARs="true" autoDeploy="true">
- <!-- SingleSignOn valve, share authentication between web applications
- Documentation at: /docs/config/valve.html -->
- <!--
- <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
- -->
-
<Context path="" docBase="C:\apache-tomcat-8.5.23\webapps\test" debug="0" reloadable="true" />
- <!-- Access log processes all example.
- Documentation at: /docs/config/valve.html
- Note: The pattern used is equivalent to using pattern="common" -->
- <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
- prefix="localhost_access_log." suffix=".txt"
- pattern="%h %l %u %t "%r" %s %b" resolveHosts="false"/>
- </Host>
这里的docBase要给成你的项目所在你服务器的本机的绝对路径;
其他不用变,启动tomcat服务器!
那么激动人心的一刻就要来了,在本地直接访问服务器的外网IP地址
oh my god! 当然了在我买的服务器到期之前,tomcat 我就一直开着了,之后的ssm框架测试也会放在该IP中!原谅我不买域名了,凑活着访问把。。
这里本想拓展一下web项目功能,但想想还是把前几天欠下的知识点补全。
第一个spring aop,在我1号的日报里是这么说的
在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。
不那么概念化说,我这有10个类,每个类都有一个测试方法
public void test(
System.out.println("测试");
)
那么我想要在这个test方法测试之前执行 :在控制台输出"(。・∀・)ノ゙嗨 我要来了!";在执行test方法之后: 在控制台输出"(。・∀・)ノ゙嗨 我走了",那么最土的方法就是
public void test1(
System.out.println("(。・∀・)ノ゙嗨 我要来了!");
System.out.println("测试");
System.out.println("(。・∀・)ノ゙嗨 我走了");
)
一行一行的复制 一个类一个类的复制,那么再做一个简单的抽取创建类
public class PublicKind {
public static void first(){
System.out.println("(。・∀・)ノ゙嗨 我要来了");
}
public static void end(){
System.out.println("(。・∀・)ノ゙嗨 我要走了");
}
}
方法就改为
@Test
public void test1(){
PublicKind.first();
System.out.println("测试");
PublicKind.end();
}
那么如果我有100个类每个类100个方法 ,那工作量也太高了,那么spring aop 就能帮我做到自动处理。
这里引入概念!
Aop, aspect object programming 面向切面编程
功能: 让关注点代码与业务代码分离!
关注点,
重复代码就叫做关注点;
在这里程序中的
System.out.println("(。・∀・)ノ゙嗨 我要来了!");
System.out.println("(。・∀・)ノ゙嗨 我走了");
就是关注点!
切面,
关注点形成的类,就叫切面(类)!
面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候网业务方法上动态植入“切面类代码”。
在这里我抽理出来的PublicKind类就是切面
切入点,
执行目标对象方法,动态植入切面代码。
可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类在运行的时候植入切面类代码。
public class Demo {
@Test
public void test1(){
PublicKind.first();
System.out.println("测试");
PublicKind.end();
}
}
有了这个概念就开始使用注解实现aop先
使用@Aspect标记切面,@Pointcut 标记切入点 ,@Before和@After切入点之前和之后执行该条件那么
public class PublicKind {
@Pointcut("execution(* test.Demo.*(..))")
public void hifrend(){
}
@Before("hifrend()")
public static void first(){
System.out.println("(。・∀・)ノ゙嗨 我要来了");
}
@After("hifrend()")
public static void end(){
System.out.println("(。・∀・)ノ゙嗨 我要走了");
}
}
在切入点表达式中,execution(* )是固定写法,第一个*表示返回的值为任意类型,加上一个空格后面跟上包名,对应包中的类,类中对应的方法,方法内带参数或不带参数都可以用(..)进行代替,通配符* 表示所有,这儿切入点表达式感觉够用了就没有再深入理解。
在@Before和@After就可以跟上Pointcut下的方法了。
@Component
public class Demo {
public void test1(){
System.out.println("测试");
}
}
核心配置文件一定不要忘了加
<!--开启注解扫描!-->
<context:component-scan base-package="test"></context:component-scan>
<!--开启aop注解扫描-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
测试成功!
@Aspect 指定一个类为切面类
@Pointcut("execution(* test.*.*(..))") 指定切入点表达式
@Before("@Pointcut定义下的方法名()") 前置通知: 目标方法之前执行
@After("@Pointcut定义下的方法名()") 后置通知:目标方法之后执行(始终执行)
@AfterReturning("@Pointcut定义下的方法名()") 返回后通知: 执行方法结束前执行(异常不执行)
@AfterThrowing("@Pointcut定义下的方法名()") 异常通知: 出现异常时候执行
@Around("@Pointcut定义下的方法名()") 环绕通知: 环绕目标方法执行
这里最后一个环绕方法能更加高度自定义处理方法,做测试
@Aspect
public class PublicKind {
@Pointcut("execution(* test.Demo.*(..))")
public void hifrend(){
}
@Around("hifrend()") //ProceedingJoinPoint表示切入点的方法
public static void around1(ProceedingJoinPoint pj) throws Throwable {
System.out.println("(。・∀・)ノ゙嗨 我在环绕");
//执行切入点的方法
pj.proceed();
System.out.println("(。・∀・)ノ゙嗨 我不环绕了");
}
}
结果。
使用xml配置文件实现aop
<!--将切面注入IOC-->
<bean id="publicKind" class="test.PublicKind"></bean>
<!--配置aop-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(* test.Demo.*(..))"></aop:pointcut>
<!---对切面配置通知方法-->
<aop:aspect ref="publicKind">
<!--对publicKind类中的配置执行方法-->
<aop:around method="around1" pointcut-ref="pt" />
</aop:aspect>
</aop:config>
删除PublicKind下的所有注释
public class PublicKind {
public static void around1(ProceedingJoinPoint pj) throws Throwable {
System.out.println("(。・∀・)ノ゙嗨 我在环绕");
pj.proceed();
System.out.println("(。・∀・)ノ゙嗨 我不环绕了");
}
}
开始测试
OK那么这儿对AOP的使用已经没什么问题了,但追求其spring aop本质,就是一种代理模式!在spring aop中分为两种
①是jdk代理也叫做动态代理
②是cglib代理
但是就精力有限,只对动态代理进行了学习
放一个核心API,今天不总结了。
|-- Proxy
static Object newProxyInstance(
ClassLoader loader, 指定当前目标对象使用类加载器
Class<?>[] interfaces, 目标对象实现的接口的类型
InvocationHandler h 事件处理器
)
明日计划:提交task1 正式开始web相关,继续补前面欠下的账
今日问题:无
收货:对web项目发布的一个粗略了解
评论