您的位置:首页 > 编程语言 > Java开发

学习北风CMS项目的时候的一些知识点 (spring, mybatis ...)

2014-10-27 14:31 393 查看

第一课知识点

1)dispatcherServlet

2)servlet pattern 配置成"/"

web.xml中<url-pattern>的3种写法

① 完全匹配

<url-pattern>/test/list.do</url-pattern>

② 目录匹配

<url-pattern>/test/*</url-pattern>

③ 扩展名匹配

<url-pattern>*.do</url-pattern>

servlet-mapping的重要规则:

☆ 容器会首先查找完全匹配,如果找不到,再查找目录匹配,如果也找不到,就查找扩展名匹配。

☆ 如果一个请求匹配多个“目录匹配”,容器会选择最长的匹配。

springMVC的url-pattern /和/*的区别:

网上有这样的回答< url-pattern > /</ url-pattern > 不会匹配到*.jsp,不会进入spring的DispatcherServlet类 < url-pattern > /* </url-pattern > 会 匹配*.jsp,

导致进入spring的DispatcherServlet 类,然后去寻找controller,接着找不到对应的controller所以报错这让我很有疑问,如果/不会匹配到*.jsp,

那么是不是*.jpg之类的静态文件也不会匹配到(不进入DispatcherServlet),

但是事实上要访问静态文件还要加<mvc:resourceslocation="/img/" mapping="/img/**"/>来避开匹配到底如何解释两种pattern的区别,

请详细说明,新手~~

回答: 对于 "/", 没放在web-inf的文件是可以直接访问到的,放在里面的才需要走这个(指<mvc:resource...>)。

我的测试结果:相见 知识点补充 章节

3) EL的使用(注:单独使用EL表达式不需要引入JSTL标签库)

controller类中:request.setAttribute("key","sjl");

jsp页面: welcome${key}

4)JSTL的使用

①在dispatcher-servlet中配置viewResolver, 其中viewClass设置为 jstlview, 从而在jsp中引入jstl的支持。

(注: viewClass的设置经过测试看起来没什么作用,可能是在一些特殊的地方需要被Spring用到,所以如果在程序中要用jstl,就设置下, 免出错)

②在 jsp页面中引入jstl标签库

<%@taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core" %>

③配合EL表达式使用JSTL标签

<c:if test="${key eq'sjl2'}">

welcome ${key}

</c:if>

5) @Resource的使用 (通过name来对应的方式),@Resource 和 @Service的使用

Spring中什么时候用 @Resource,什么时候用 @service:

当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义为一个bean,bean名称为XXX;

当需要在某个类中定义一个属性,并且该属性是一个已存在的bean,要为该属性赋值或注入时在该属性上一行使用@Resource(name="xxx"),相当于为该属性注入一个名称为xxx的bean。

6) @Controller

第二课知识点

1) applicationContext.xml 和 dispatch-servlet.xml的区别:

Springlets you define multiple contexts in a parent-child hierarchy.

TheapplicationContext.xml defines the beans for the "root webappcontext", i.e. the context associated with the webapp.

Thespring-servlet.xml (or whatever else you call it) defines the beans for oneservlet's app context. There can be many of these in a webapp, one per Springservlet (e.g. spring1-servlet.xml for servlet spring1, spring2-servlet.xml forservlet spring2).

Beansin spring-servlet.xml can reference beans in applicationContext.xml, but notvice versa.

AllSpring MVC controllers must go in the spring-servlet.xml context.

Inmost simple cases, the applicationContext.xml context is unnecessary. It isgenerally used to contain beans that are shared between all servlets in awebapp. If you only have one servlet, then there's not really much point,unless you have a specific
use for it.

注: 1)一个bean如果在两个文件中都被定义了(通过componentscan), spring会在application context和 servlet context中都生成一个实例,他们处于不同的上下文空间中。

2) 如果在application context和 servlet context中都存在同一个 @Service 的实例, controller(在servlet context中) 通过 @Resource引用时, 会优先选择servlet context中的实例。

2) classpath 与 classpath* 的区别

Spring(包括web.xml配置)可以通过指定classpath*:与classpath:前缀加路径的方式从classpath加载文件,如bean的定义文件.

classpath*:的出现是为了从多个jar文件中加载相同的文件.classpath:只能加载找到的第一个文件.

比如 resource1.jar中的package 'com.test.rs' 有一个 'jarAppcontext.xml' 文件,内容如下:

<bean name="ProcessorImplA"class="com.test.spring.di.ProcessorImplA" />

resource2.jar中的package 'com.test.rs' 也有一个 'jarAppcontext.xml' 文件,内容如下:

<beanid="ProcessorImplB"class="com.test.spring.di.ProcessorImplB" />

通过使用下面的代码则可以将两个jar包中的文件都加载进来

ApplicationContext ctx = newClassPathXmlApplicationContext("classpath*:com/test/rs/jarAppcontext.xml");

而如果写成下面的代码,就只能找到其中的一个xml文件(顺序取决于jar包的加载顺序)

ApplicationContextctx = new ClassPathXmlApplicationContext("classpath:com/test/rs/jarAppcontext.xml");

classpath*:的使用是为了多个component(最终发布成不同的jar包)并行开发,各自的bean定义文件按照一定的规则:package+filename,

而使用这些component的调用者可以把这些文件都加载进来.

实例:

web.xml

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath*:applicationContext-*.xml</param-value>

</context-param>

applicationContext.xml:

<!-- sqlSessionFactory -->

<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">

<propertyname="dataSource" ref="dataSource"></property>

<propertyname="configLocation"value="classpath:mybatis.xml"></property>

<propertyname="mapperLocations">

<list>

<value>classpath:com/hzjw/mapper/account-mapper.xml</value>

</list>

</property>

</bean>

3)mybatis的配置和使用

mybatis的配置, 包括Sqlmapper,AccountMapper等接口的定义,mapper配置文件的定义以及spring 配置文件的中的配置。

mybatis的使用,只需要写sqlmapper等接口就行, spring 自动根据mapper接口生成实现类并进行管理。

可以在service类中通过 @Resource 引入 spring 自动生成的mapper接口的实现类。

例如:

@Resource

privateAccountMapper am;

4) MyBatis的mapper接口中方法的多参数问题

MyBatis的mapper接口不需要自己实现,框架会自动帮我们实现,到时候直接调用就可以了。定义的mapper接口中的方法可以有多个参数吗?

答案是肯定。在Ibatis时代是自己通过代码实现如何调用xml中定义的statement,接受的参数只能是一个,所以处理的办法通常是用Map的方式。

当然这个也能使用在MyBatis上,不过MyBatis提供更加简单的方法。下面就通过例子来说明。

Mapper接口:

方法1:public void deleteById(int idt, String name);

方法2:public voiddeleteById(@Param("p1")int idt, @Param("p2")String name);

mapper.xml:

方法1:

<deleteid="deleteById">

delete from account where id=#{0} andname=#{1}

</delete>

方法2:

<deleteid="deleteById">

delete from account where id=#{p1} andname=#{p2}

</delete>

上述两种方法都行的通,上述statement中不需要指定parameterType。如果不使用 @Param注解方式,那么可以通过#{0}、#{1}的方式来获取参数的值,注意function中的第一个参数是0;

使用了注解就按注解中定义的名字来取。推荐使用注解的方式。

在方法重构时,例如增加、减少或调整参数的顺序,如果使用非注解的方式,在修改xml时就显得比较麻烦,可能里面的${0}、${1}、${2}都需要调整,而且不明确,特别是参数较多的情况下。

参考:http://www.netingcn.com/mybatit-mapper-interface-parameter.html

第三课知识点

1) sqlSessionDaoSupport方式 和sqlMapper方式的对比

sqlSessionDaosupport方式可以简化编程,提高效率, 在mapper这一层,只需要统一写一个IdaoImpl就可以了。sqlMapper方法需要针对每一个entity写一个mapper类, 比较繁琐。

2)sqlSessionDaoSupport和sqlSessionTemplate 使用和对比

sqlSessionTemplate是spring提供给mybatis的核心类, 它除了实现sqlsession外, 还提供对sqlsession的管理, 事务和多线程的支持等, 使得mybatis可以很好的用于spring中

(注:mybatis默认提供的sqlsession类缺乏事务和多线程的支持,所以spring 提供了sqlsessionTemplate)

Dao对象要使用sqlsessionTemplate对象, 需要写getSqlsessionTemplate 和 setSqlsessioinTemplate方法, 还需要在配置文件中注入sqlsessionTemplate, 比较繁琐;

为此, Spring 提供了sqlsessionDaoSupport类, 它默认实现了getSqlsessionTemplate 和 setSqlsessioinTemplate方法, 所以只需要在简单继承就好了。

参考: http://stark-summer.iteye.com/blog/1333033
3)需要巩固下Java泛型的知识
http://blog.csdn.net/lonelyroamer/article/details/7864531 http://blog.csdn.net/lonelyroamer/article/details/7868820

第四课知识点

1. 如何取到参数化类型的实际类型

public
static
ClassgetEntityClass (Class c) {
Typetype = c.getGenericSuperclass();
if (type
instanceofParameterizedType) {
Type[]types = ((ParameterizedType)type).getActualTypeArguments();
return (Class)types[0];
}else{
return Object.class;
}

}

2. Junit 测试用例的编写和spring bean的测试

private
static
UserService us;

@BeforeClass
public
static void
setUpBeforeClass()
throws Exception {
ApplicationContextac = newClassPathXmlApplicationContext("applicationContext.xml");
us =ac.getBean(UserService.class);
}

第五课知识点

1. Mysql 的limit

limit是mysql的语法

select * from table limit m,n

其中m是指记录开始的index,从0开始,表示第一条记录

n是指从第m+1条开始,取n条。

select * from tablename limit 2,4

即取出第3条至第6条,4条记录

2. 分页的实现

Page-tablib, pager对象

3. Mybatis
中sql
多参数的问题,通过一个map来传递

Map中的key的名字就是sql中placeholder的名字。

知识点补充:

1. <c:url> 的使用

在jsp或者html页面中,没有使用<c:url>标签之前必须使用文档相对路径或是绝对路径对目标资源进行定位,如果使用根相对路径就会发生错误,具体详见J2EE中的绝对路径&根相对路径&文档相对路径问题注意,但是在使用<c:url>标签的时候就可以以Web应用的根目录为参考点出发进行资源的定位,即根相对路径的使用.

http://blog.sina.com.cn/s/blog_6a0cb8bc0100whp6.html

http://blog.sina.com.cn/s/blog_6a0cb8bc0100vpkc.html

注:在Servlet或者web后台程序(包括spring
配置文件)中使用request.getRequestDispatcher("路径").forward();其中这里的路径可以使用根相对路径,绝对路径也可是文档相对路径.这是跟JSP页面不相同的一个特点.


注:

指定网络上的资源的3种方式:

1.绝对路径 eg: http://www.baidu.com/index.html
2.根相对路径 eg: /index.html

3.文档相对路径 eg: ./index.html , account/add

2. Jsp 中 <base
href="<%=basePath%>">的作用

在Jsp中,你往往会看到下面一些设置:
<%
Stringpath = request.getContextPath();
StringbasePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<base
href="<%=basePath%>">

上面这些设置的作用其实和c:url 的作用是类似的, 就是让jsp页面中所有文档相对路径都相对于base 中设置的url, 因为base 的url被设置成立 web应用程序的根目录, 所以jsp页面中所有的相对路径都可以从web应用程序根目录开始。

比如:页面http://localhost/webroot/account/add页面中有一个form表单, 它的action指向
http://localhost/webroot/account/find

如果不设置 <base> url, 那么 form的action应该这样写: action=”find”, 因为find页面和add页面在同一个目录,action中的路径是相对于add页面的。

如果设置了<base> url, action就可以写成:action=”account/find”。

由此可见,设置base url, 有助于应用程序路径的统一,维护和阅读代码也比较方便。

3. Servlet url-pattern

一,servlet容器对url的匹配过程:

当 一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是 http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉, 剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下 的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:

1. 精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的 servlet了。

2. 最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此 时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。

3. 扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action

4. 如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。

根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。

对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一 个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。

二,url-pattern详解

在web.xml文件中,以下语法用于定义映射:

l. 以”/’开头以”/*”结尾的是用来做路径映射的。

2. 以前缀”*.”开头的是用来做扩展映射的。

3. “/” 是用来定义default servlet映射的。

4. 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action

所以,为什么定义”/*.action” 这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断
“/index*” 这种形式 , 容器也无法判断, 看起来容器只认识前面提到的几种形式。
另外,web应用中, url 匹配的顺序是按照上面提到的优先级来走的, 和web.xml中servlet-mapping 定义的顺序无关(已经过验证,但是servlet filter的匹配顺序是和定义顺序有关的)。

4. url-pattern / 和 /*的区别

/ 和 /* 走的都是路径匹配,他们都可以匹配诸如 /index, /index.html, /index.jpg等url, 但是/*的优先级比/要高,具体为:

/ < 扩展匹配 < /*

所以, 对于路径 /index.jpg:

在下面的配置中, @RequestMapping("/index")可以匹配 /index, /index.jpg, /index.html等多种形式 (注:/index.jsp不会被匹配,解释见后面)

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

在下面的配置中,匹配的servlet 为 defaultservlet, 因为 *.jpg的优先级高于 /

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>

在下面的配置中,匹配的servlet 为 dispatcher, 因为 *.jpg的优先级低于 /*

<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>

注: .jsp文件的特殊性
经过本人测试, 当dispatcher的 url-pattern 配置为 / 的时候, .jsp文件始终不会被dispatcher匹配,容器会直接解析 .jsp文件, 就好像存在着下面这样一个配置。
<servlet-name>default</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
如果dispatcher 配置 url-pattern为 /* 的时候, .jsp就会被dispatcher匹配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐