因为做webgame gm服务器,整体采用的是spring mvc架构,所以简单入门学习一下:
1.spring mvc基本流程 从URL接受请求及数据->DispacherServlet->根据请求调用具体的Controller->Controller->调用service方法处理数据->通过DAO访问 db->增删改查->db->返回操作结果集->service->处理返回结果->Controller->返回具体页面和数据->jsp页面 2.spring mvc注解 @Controller,@Service,@Repository @Controllers声明控制层。@Service声明服务层。@Repository声明持久层(数据传输层DAO) @RequestMapping把一个POJO声明为Spring里的Controller.如果不声明要写Controller类就要从Spring的Controller类继承,并重写handleRequest方法。 @RequestMapping(value="*.htm",method=RequestMethod.GET);属性value声明Controller处理的请求,method声明处理请求的类型。可声明在类头上,也可声明在方法头上。 @RequestParam绑定参数与请求参数;例:public String Controller(@RequestParam("id") int topicId,User user)把参数 topicld与请求的参数“id”绑定,id的值传入topicld。 @AutoWired根据类型自动装配,可放在属性上,set方法上,构造方法上。与@AutoWierd配套使用的是@Qualifier。按名字自动装配。 @Resource与@AutoWired类似 3.DispatcherServlet-org.springframework.web.servlet.Dispatc-herServlet 负责将请求分配给控制对象,所以使用Spring MVC的第一步是在web.xml中定义DispatcherServlet;
1
<
servlet
>
2
<
servlet-name
>
hello
</
servlet-name
>
3
<
servlet-class
>
4
org.springframework.web.servlet.DispatcherServlet
5
</
servlet-class
>
6
<
init-param
>
7
<
param-name
>
contextConfigLocation
</
param-name
>
8
<
param-value
>
9
/WEB-INF/mvc-config.xml,
10
/WEB-INF/spring-config.xml
11
<
param-value
>
12
<
init-param
>
13
</
servlet
>
14
..... 可以加上contextConfigLocation的初始参数,用来设置Bean定义文件的位置和名称,默认使用“Servlet名-servlet.xml";可以加上多个bean文件的来源;如果一个都没加则找默认的;hello-servlet.xml
spring-servlet.xml-
1
<
context:component-scan
base-package
="cn.spring.demo"
/>
2
<
bean
3
class
="org.springframework.web.servlet.view.InternalResourceView-Resolver"
4
p:prefix
=""
p:suffix
=".jsp"
/>
base-package为注入bean时要spring要查找的包; Controller回传ModleAndView,DispatcherServlet会交给ViewResolver解析。如:回传一个字符串“index”,解析后找到/WEB-INF/index.jsp 4.Controller-
1
@Controller
//
将类声明为Spring容器里的Bean,Spring调用时实例化
2
@RequestMapping(
"
index.htm
"
)
//
声明这个Controller处理的请求是什么
3
public
class
IndexController
4

{ 5
@RequestMapping(method = RequestMethod.GET) 6
public String doGet() 7
{ 8
return"index"; 9
}10
}
返回“index”,交由ViewResolver解析,返回调用“/WEB-INF/index.jsp”
1
//
处理post请求的Controller
2
@Controller
3
@RequestMapping(value
=
"
index.htm
"
,method
=
RequestMethod.POST)
4
public
String doPost(String username, String password, ModelMap modelMap)
throws
Exception
5

{ 6
modelMap.addAttribute("name",username); 7
return"index"; 8
}
把username以名值对的形式放入ModelMap,在index.jsp中用request对象接收;ModleMap,Spring提供的集合可以传递数据到返回的jsp页面 http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/
以上为基于注解驱动的mvc
5.DispacherServlet-HandlerMapping-ModleAndView-Controller-ViewResolver-View 1.web.xml指定DispacherServelet和servlet的xml web.xml-
1
<
servlet
>
2
<
servlet-name
>
buzzwords
</
servlet-name
>
3
<
servlet-class
>
4
org.springframework.web.servlet.DispatcherServlet
5
</
servlet-class
>
6
<
load-on-startup
>
1
</
load-on-startup
>
7
</
servlet
>
8
9
<
context-param
>
10
<
param-name
>
contextConfigLocation
</
param-name
>
11
<
param-value
>
/WEB-INF/buzzwords-service.xml
</
param-value
>
12
</
context-param
>
13
<load-on-startup>标记容器是否在启动的时候就加载这个servlet,数字越小,当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载;正数的值越小,启动该servlet的优先级越高 2.BuzzwordsController-不用@Controllers则需要实现Controller接口
1
public
class
BuzzwordsController
implements
Controller
2

{ 3
private BuzzwordService facade; 4
publicvoid setFacade(BuzzwordService facade) 5
{ 6
this.facade = facade; 7
} 8
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception 9
{ 10
returnnew ModelAndView("buzzwords", "buzzwordService", facade); 11
}12
}
13
3.buzzwords-servlet.xml-指定servlet controller和urlmapping的映射关系
1
<
bean
id
="buzzwordsController“
2
class="
BuzzwordsController"
>
3
<
property
name
="facade"
><
ref
bean
="buzzwordService"
/></
property
>
4
</
bean
>
5
6
<
bean
id
="urlMapping"
class
="SimpleUrlHandlerMapping"
>
7
<
property
name
="mappings"
>
8
<
props
>
9
<
prop
key
="/buzzwords.htm"
>
10
buzzwordsController
11
</
prop
>
12
13
4.指定viewResolver
1
<
bean
id
="viewResolver"
class
="org.springframework
InternalResourceViewResolver"
>
2
<
property
name
="viewClass"
>
3
<
value
>
org.springframework
View
</
value
>
4
</
property
>
5
<
property
name
="prefix"
><
value
>
/WEB-INF/jsp/
</
value
></
property
>
6
<
property
name
="suffix"
><
value
>
.jsp
</
value
></
property
>
7
</
bean
>
5.buzzwords.jsp 6.参考 \spring mvc\Spring MVC 详解.ppt \spring mvc\Spring MVC 技术交流.ppt 1. DispatchServlet在Web容器初始化的时候完成初始化——initStrategy() 2.ViewResolver-从一个String逻辑视图名映射到一个视图对象;对JSP用户, 通常实现 InternalResourceViewResolver 3.Controller负责接收从DispatchServlet转发的URL请求
开发一个Spring MVC程序的基本步骤: 1编写处理请求逻辑的处理器-controller; 2在DispatcherServlet上下文对应的Spring配置文件中配置处理器; 3配置一个视图解析器,对处理器返回的ModelAndView进行解析; 4编写一个视图对象(jsp或ftl等),将响应展现给客户
Controller -AbstractController -MultiActionController 将多个请求行为合并在一个控制器里 -BaseCommandController -AbstractCommandController 能将请求参数绑定到命令对象 -AbstractFormController 支持表单提交的抽象控制器类 -SimpleFormController 简单表单处理控制器 -AbstractWizardFormController 向导型表单处理控制器
ViewResolver接口:Controller传回ModelAndView对象,DispatcherServlet将其交由ViewResolver来作View层的相关解析。要在Spring MVC配置文件中定义一个ViewResolver实例
ModelAndView-Mode1AndView 类代表了 Spring Web MVC 程序中,呈现画面时所使用 Model 数据对象与 View 数据对象,由于 Java 程序的方法中一次只能回传一个对象,所以 Modelview 的作用是封装这两个对象,方便您同时返回 Model 与 View SimpleUrlHandlerMapping-最常用的处理器映射,将请求的URLs 影射到handlers;由一系列的分别代表URLs 和bean 的名字的name/value 对来定义影射;在x-servlet.xml中定义
7. 参考\spring mvc\Spring_Web_MVC_架构.ppt 1.web.xml:
1
<
servlet
>
2
<
servlet-name
>
dispatcherServlet
</
servlet-name
>
3
<
servlet-class
>
4
org.springframework.web.servlet.DispatcherServlet
5
</
servlet-class
>
6
<
init-param
>
7
<
param-name
>
contextConfigLocation
</
param-name
>
8
<
param-value
>
/WEB-INF/mvc-config.xml
</
param-value
>
9
</
init-param
>
10
<
load-on-startup
>
1
</
load-on-startup
>
11
</
servlet
>
12
13
<
servlet-mapping
>
14
<
servlet-name
>
dispatcherServlet
</
servlet-name
>
15
<
url-pattern
>
*.do
</
url-pattern
>
16
</
servlet-mapping
>
17
可以在 XML 文件中设定 Controller 请求处理完毕之后,所要呈现数据的网页路径,见mvc -config . xml
2.controller:
1
public
class
HelloController
implements
Controller
2

{ 3
private String viewPage; 4
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception 5
{ 6
String user = req.getParameter("user"); 7
//viewPage与mvc-config.xml中的<property name="viewPage">对应,<value>对应返回的jsp页面 8
returnnew ModelAndView(viewPage, "user", user); 9
} 10
publicvoid setViewPage(String viewPage) 11
{ 12
this.viewPage = viewPage; 13
}14
}
3.mvc-config.xml:
1
<
beans
>
2
<
bean
id
="viewResolver"
3
class
="org.springframework.web.servlet.view.InternalResourceViewResolver"
>
4
<
property
name
="prefix"
>
5
<
value
>
/WEB-INF/jsp/
</
value
>
6
</
property
>
7
<
property
name
="suffix"
>
8
<
value
>
.jsp
</
value
>
9
</
property
>
10
</
bean
>
11
12
<
bean
name
="/hello.do"
13
class
="onlyfun.caterpillar.HelloController"
>
14
<
property
name
="viewPage"
>
15
<
value
>
hello
</
value
>
16
</
property
>
17
</
bean
>
18
</
beans
>
19
DisPatcherServlet 必须根据一个 HandlerMaPping 对象,决定请求由哪一个 Controller 来处理, DispatcherServlet 默认使用 org.spring- framwork .web.servlet.handler . BeanNameUrlHandlerMapping ,也就是根据 Bean 在定义时的”name”属性及使用者请求的 URL ,决定使 用哪一个 controller 实例,例如在这个例子中,请求 / FirstSpringMVC / hello.do 时, DispatcherServlet 根据” hello.do ”名称,决定要 使用 “name”为”hello.do”的 Bean 实例,所以就是将请求交由 HelloController 的实例来处理。
在 controller 返回 ModelAndView 后, Dispatcherservlet 会交由 ViewResolver 对象来作 View 层的相关解析,因而您需要设置一个 ViewResolver 实例,在这个范例中将以 JSP 作为 View 层技术-InternalResourceViewResolver如果想要在自己所定义的 servlet 类中使用 spring 的容器功能,则也可以使用org·springframework·web·context·ContextLoaderListener contextLoaderListener 默认会读取 applicationContext.xml,您可以指定自己的定义文件,只要在 <context-param>中指定”contextConfigLocation”参数;
WebApplicationContext 实现了 ApplicationContext 接口,是 Spring 专为 Servlet 的 Web 应用程序设计的ApplicationContext 实现类,在取得 WebApplicationContext 之后,可以利用它来取得 Bean 定义文件中定义的 Bean 实例; 即web.xml中-
1
<
context-param
>
2
<
param-name
>
contextConfigLocation
</
param-name
>
3
<
param-value
>
/WEB-INF/beans-config.xml
</
param-value
>
4
</
context-param
>
5
<
listener
>
6
<
listener-class
>
7
org.springframework.web.context.ContextLoaderListener
8
</
listener-class
>
9
</
listener
>
10
beans-config.xml-
11
<?
xml version="1.0" encoding="UTF-8"
?>
12
<!
DOCTYPE beans PUBLIC
13
"-//SPRING/DTD BEAN/EN"
14
"http://www.springframework.org/dtd/spring-beans.dtd"
>
15
16
<
beans
>
17
<
bean
id
="dateBean"
class
="java.util.Date"
singleton
="false"
/>
18
</
beans
>
19
20
4.MultiActionController -如果为每一个请求编写一个 Controller 类,在程序规模增大时,您的 Controller 类将会迅速增加,可以继承 或直接使用MultiActionController类,将数个相关的请求处理集中于同一个对象,而不用每一个请求编写一个控制对象。 使用MultiActionController,您要配合一个 MethodNameResolver 的实例, MultiActioncontroller 默认使用的 MethodNameResolver 类是
org . springframework . web . servlet . mvc . multiaction . InternalPathMethodNameResolver ,这个类可以根据所给的网址中,最后请求的 文件名称来判断执行 Controller中的哪一个方法,例如/test . do 的请求会执行 test ( HttpservletRequest , HttpservletResponse )方法 。但通常不会使用 InternalPathMethodNameResolver ,因为这就失去了使用 MultiActionController 的一些优点,像是依使用者的请求 参数来决定所要执行的方法。 改用->ParameterMethodNameResolver mvc-config.xml-
1
<
bean
id
="paraMethodResolver"
2
class
="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"
>
3
<
property
name
="paramName"
>
4
<
value
>
action
</
value
>
5
</
property
>
6
<
property
name
="defaultMethodName"
>
7
<
value
>
list
</
value
>
8
</
property
>
9
</
bean
>
10
11
<
bean
id
="bookController"
class
="onlyfun.caterpillar.BookController"
>
12
<
property
name
="methodNameResolver"
>
<
ref
bean
="paraMethodResolver"
/>
</
property
>
13
也可以将所有相对应的方法专门组织在一个委托(delegate)物件中,而不是撰写在 Controller 类别中,当请求来到时,将 委托给这个物件来执 行指定的方法,您只要设定 MultiActionController 的"delegate"属性参考至委托物件即可
或者->PropertiesMethodNameResolver
1
<
bean
id
="propMethodResolver"
class
="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"
>
2
<
property
name
="mappings"
>
3
<
props
>
4
<
prop
key
="/listbook.do"
>
list
</
prop
>
5
<
prop
key
="/addbook.do"
>
add
</
prop
>
6
<
prop
key
="/deletebook.do"
>
delete
</
prop
>
7
</
props
>
8
</
property
>
9
</
bean
>