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

springMVC 笔记

2015-08-16 18:49 549 查看
springmvc工作流程:
1 用户请求 如 /user.xhtml
2 DispatchServlet拦截,web.xml中配置 *.xhtml 被DispatchServlet拦截
3 DispatchServlet 通过handlerMaping检查
该请求匹配的controller
4 执行Controller完毕后,如果返回字符串viewResolver包装成相应对象,如果返回ModelAndView本身含有view视图对象。
5 DispatchServlet将视图对象输出,然后输出给客户端
<!-- 静态资源访问 过滤静态文件-->

<mvc:resourceslocation="/img/"mapping="/img/**"/>

启用注解:

<!-- 注解扫描包 -->
<context:component-scanbase-package="com.tgb.web.controller.annotation"/>
<!-- 开启注解 spring2-->
<beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<beanclass="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean>

<!-- 开启注解
spring3 相当于以上两个注解类-->
<mvc:annotation-driven/>

<mvc:annotation-driven /> 会自动注册
RequestMappingHandlerMapping
RequestMappingHandlerAdapter 与
ExceptionHandlerExceptionResolver 三个bean。
还将提供以下支持:•
支持使用ConversionService 实例对表单参数进行类型转换–
支持使用@NumberFormat
annotation、@DateTimeFormat –注解完成数据类型的格式化
支持使用@Valid 注解对JavaBean 实例进行JSR
303 验证–
支持使用@RequestBody 和@ResponseBody 注解
@Valid 校验
需校验的 Bean 对象和其• 绑定结果对象或错误对象时成对出现的,它们 之间不允许声明其他的入参

(@Valid User user, BindingResult
userBindingResult)

@RequestMapping(value="/user/addUser",method=RequestMethod.POST) //如果写明Post方法,必须提交post方法,如果不写,post或者Get方法都可接收
public ModelAndView
addUser(){
String result
="this is addUser------";
returnnew ModelAndView("/jquery","result",result);
}

//直接返回json对象,一般用于ajax请求,HttpMessageConverter转换

@ResponseBody

@RequestMapping("/testJson")

public Collection<Employee>
testJson(){

return employeeDao.getAll();

}
加入 jackson
jar 包后, RequestMappingHandlerAdapter • 装配的 HttpMessageConverter

//spring的上下文 Service
Resource
WebApplicationContext ac1 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
//springMVC的上下文(继承Spring上下文)
xxxController yyyController
WebApplicationContext ac2 = RequestContextUtils.getWebApplicationContext(request);
//ISpring springManager = (ISpring) ac1.getBean("springManager");
ISpring springManager = (ISpring)ac2.getBean("springManager");

注解:
@Value
public class VariableConfigurationFilter extends IgnorableFilter {
@Value("${css.base.path}")
//spring annotation 注入资源文件
private String cssBasePath;
}

getFields()只能获取public的字段,包括父类的。
getDeclaredFields()只能获取自己声明的各种字段,包括public,protected,private。

Controller 控制器接收请求Request控制器

直接实现Controller 接口或AbstractController抽象类
ParameterizableViewController:直接转发的controller,无处理逻辑,不需要再实现无任何行为的controller类,登录常用.

<bean id="LoginAction" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="login"></property></bean>
查找过程:LoginAction->ParameterizableViewController->login->/WEB-INF/jsp/login.jsp

UrlFilenameViewController: 请求URL与要找的资源名称一致时,使用更简单的

<bean id="LoginAction" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
查找过程:login.test->LoginAction ->UrlFilenameViewController->解析url,分析出login,再根据规则跳转到login.jsp中

CommandController 封装表单参数的控制器入参数封装command对象,类同 FormController

public class MyAbstractCommandController extends AbstractCommandController {
@Override
protected ModelAndView handle(HttpServletRequest req, HttpServletResponse resp, Object command, BindException errors) throws Exception{
//将命令对象转换为实际类型
UserModel user = (UserModel) command;
ModelAndView mv = new ModelAndView();
mv.setViewName("abstractCommand");
mv.addObject("user", user);
return mv;
}
}

MultiActionController:用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,methodNameResolver是映射到具体方法上

ParameterMethodNameResolver:paramName值去解析映射到相应方法

<bean id="mutiController" class="com.sunshine.controller.MutiController">
<property name="userService" ref="userService"></property>
<property name="methodNameResolver" ref="paraMethodResolver"></property>
</bean>
<!--multy.do?method=getXxx() 调用相应方法
Controller方法调用规则定义
配置MultiActionController使用的方法对应策略ParameterMehtodNameResolver,
用于解析请求中的特定参数的值,将该值作为方法名调用 -->
<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="method" />
</bean>

PropertiesMethodNameResolver

<bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
<property name="mappings">
<value>/abc/test.do=doTest</value>
</property>
</bean>


InternalPathMethodNameResolver

这个实现类是依据请求的路径来决定执行MultiActionController的那个方法的。例如路径为:getlist.htm,则执行相应controller的getlist方法。在实际开发中,不提倡使用这个MethodNameResolver、
<bean id="resolver” class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />


Handler Mapping 根据请求规则映射到指定类或方法上

DefaultAnnotationHandlerMapping:注解常用

SimpleUrlHandlerMapping:key请求url,value为相应XxxController

<!-- 配置处理器映射 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- prop标签中的key都是url值,后面的为BeanID如果我们在地址栏中输入的url 与key匹配,则分发到prop标签中指定的beanID所指定的Controller -->
<prop key="addEmp.do">addEmpController</prop>
<prop key="saveEmp.do">empController</prop>
</props>
</property>
</bean>

BeanNameUrlHandlerMapping: 这是Dispatcher
Servlet的默认的HandlerMapping,根据name值映射相应XxxController

<bean name="/listCourses.go" class="com.w3cs.vlar.ListCoursesController">

ControllerClassNameHandlerMapping

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
<bean class="com.mkyong.common.controller.WelcomeController" />
<bean class="com.mkyong.common.controller.HelloGuestController" />
WelcomeController -> /welcome*
HelloGuestController -> /helloguest*


ViewResolver(逻辑策略,根据返回逻辑名称request.foward()对应实际页面)

& View(用于将实际Model和要输出页面数据整合渲染) JstlView、

ViewResolver:要根据给定逻辑视图名字通过指定视图解析器的策略 ,解析器优先级根据Order排序

InternalResourceViewResolver、 FreeMarkerViewResolver、VolocityViewResolver
(都是URLBasedViewResolver子类): 在视图逻辑名前面加上prefix,后面加上suffix

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
//逻辑视图名字解析
protected View resolveViewName(String viewName, Map<String, Object> model, Locale locale,
HttpServletRequest request) throws Exception {
for (ViewResolver viewResolver : this.viewResolvers) {
View view = viewResolver.resolveViewName(viewName, locale);
if (view != null) {
return view;
}
}
return null;
}
//也可以自己定义ViewClass,渲染数据
@Component
public class HelloView implements View{
@Override
public String getContentType()
{
return "text/html";
}
@Override
public void render(Map<String,
?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
response.getWriter().print("hello
view, time: " + new Date());
}
}

Ø BeanNameViewResolver:根据返回逻辑视图名称test去寻找相应的View对象
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="1"/>
</bean>
<bean id="test" class="org.springframework.web.servlet.view.InternalResourceView">
<property name="url" value="/index.jsp"/>
</bean>

ResourceBundleViewResolver:资源文件去映射



//调用方法栈

public void getCaller(){

StackTraceElement stack[] = Thread.currentThread().getStackTrace();

for (StackTraceElement ste:stack){

System.out.println("called by "+ste.getClassName()+"."+ste.getMethodName()+"/"+ste.getFileName());

}

}

<form method='post' action='url'>

用户名 <input type='text' name='u_name'>

用户id <input type='text' name='u_id'>

食品名 <input type='text' name='f_name'>

食品id <input type='text' name='f_id'>

<input type='text' name='gender'>

<input type='text' name='age'>

<input type='text' name='price'>

<input type='text' name='date'>

</form>



@requestMap(value={'/order/book'})

public string show(UserFoodDto
dto){

//然后拆分,将字段

User u = new User();

Food f = new Food();



u.setName(dto.getUname());

f.setName(dto.getname());



u.setUid(dto.getUid());

f.setFid(dto.getFid());



u.setAge(dto.getAge);

f.setPrice(dto.getPrice);

.....

}

--桥接

<form method='post' action='url'>

用户名 <input type='text' name='u_name'>

用户id <input type='text' name='u_id'>

食品名 <input type='text' name='f_name'>

食品id <input type='text' name='f_id'>

<input type='text' name='gender'>

<input type='text' name='age'>

<input type='text' name='price'>

<input type='text' name='date'>

</form>



-----将冲突的字段专门建立一个javaBean

public String UFBridge{



private String uname;

private String uid;

private String fname;

private String fid;

}

--------------------------

@requestMap(value={'/order/book'})

public string show(User u,Food
f,UFBridge ufb){



u.setName(ufb.getUname());

f.setName(ufb.getUname());



u.setId(ufb.getUid);

f.setId(ufb.getFid);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: