springMVC 笔记

springmvc工作流程:
1 用户请求 如  /user.xhtml
2 DispatchServlet拦截,web.xml中配置 *.xhtml 被DispatchServlet拦截
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 userBindingResult 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。



  1. 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是映射到具体方法上
  1. ParameterMethodNameResolverparamName值去解析映射到相应方法

    <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>

  1. PropertiesMethodNameResolver

<bean id="resolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> 

 <property name="mappings">    

    <value>/abc/test.do=doTest</value>    

</property>                                                  

</bean> 

 

  1. InternalPathMethodNameResolver

这个实现类是依据请求的路径来决定执行MultiActionController的那个方法的。例如路径为:getlist.htm,则执行相应controllergetlist方法。在实际开发中,不提倡使用这个MethodNameResolver

<bean id="resolver”  class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver" />

 

  1. 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*

 

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

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

 

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

  • InternalResourceViewResolver FreeMarkerViewResolverVolocityViewResolver (都是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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值