SpringMVC的login案例(注解方式)----2018-09-25

注解方式的login案例

web.xml



   
  
  
    spring
    org.springframework.web.servlet.DispatcherServlet
    
    1



    spring
    *.do

 
    org.springframework.web.context.ContextLoaderListener

  



    contextConfigLocation
    /WEB-INF/applicationContext.xml


spring-servlet.xml





     
    

    
    

    
    

    
    
    
                 
     
       

     
  

applicationContext.xml




    

TestController

package com.asm;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.RedirectView;

//import entity.User;

@Controller  //类似Struts的Action
public class TestController {

    @RequestMapping("/login.do")  // 请求url地址映射,类似Struts的action-mapping
    public String testLogin(@RequestParam(value="username")String name, String password, HttpServletRequest request) {
        // @RequestParam一般用于当表单的请求参数名和方法中形参不一致时,将指定的请求参数付给方法中形参
        // @RequestParam可简写为:@RequestParam("username")
         request.setAttribute("username", name);
         request.setAttribute("password", password);
        if (!"admin".equals(name) || !"admin".equals(password)) {
            return "failure"; // 跳转页面路径(默认为转发),该路径不需要包含spring-servlet配置文件中配置的前缀和后缀
        }
        return "success";
    }
    
    
    @RequestMapping("/login2.do")
    public ModelAndView testLogin2(String username, String password,int age,HttpServletRequest request){
        // request和response不必非要出现在方法中,如果用不上的话可以去掉
        // 参数的名称是与页面控件的name相匹配,参数类型会自动被转换
        request.setAttribute("username", username);
        request.setAttribute("password", password);
        request.setAttribute("age", age);
        if ("admin".equals(username) &&"admin".equals(password)) {
            return new ModelAndView("success"); // 手动实例化ModelAndView完成跳转页面(转发),效果等同于上面的方法返回字符串
        }
        return new ModelAndView(new RedirectView("./index.jsp"));  // 采用重定向方式跳转页面
        // 重定向还有一种简单写法
        // return new ModelAndView("redirect:../index.jsp");
    }
    
    
    @RequestMapping("/login3.do")
    
    public ModelAndView testLogin3(User user) {
        // 同样支持参数为表单对象,User类似于Struts的ActionForm,User不需要任何配置,直接写即可,放到request内置对象中。
        String username = user.getUsername();
        String password = user.getPassword();
        int age = user.getAge();
        
        if (!"admin".equals(username) || !"admin".equals(password) ) {
            return new ModelAndView("error");
        }
        return new ModelAndView("success");
    }

    @Resource(name = "loginService")  // 获取applicationContext.xml中bean的id为loginService的对象,并注入给下面标识的对象
    private LoginService loginService;  //等价于spring传统注入方式写get和set方法,这样的好处是简洁工整,省去了不必要得代码

    @RequestMapping("/login4.do")
    public String testLogin4(User user) {
        if (loginService.login(user) == false) {
            return "error";
        }
        return "success";
    }
 }

login1知识点
1、tomcat一启动,读取web.xml,创建监听器对象,appication一创建,就把全局参数封装到application,里取得配置信息,创建bean工厂,
创建DispatcherServlet对象,执行init方法,读取主配信息,创建web工厂,里面要创建三个对象
(1)创建请求分派器对象(请求适配器AnnotationMethodHandlerAdapter),
(2)创建后端控制器对象。启动注解,扫描包,到对应的包下找到注解为@Controller 标识的类,创建这个类的对象
(3)创建视图定位器对象。
2、浏览器发请求,请求一提交,tomcat就创建request对象封装请求参数,一看是.do的请求,就交给DispatcherServlet。DispatcherServlet一拿到这个请求,就进行截取,截取成“/login.do”,到web工厂里找请求分派器,找到后端控制器,根据 @RequestMapping注解把请求关联到action(后端控制器、业务层前端控制器)对应的方法上。
一调用这个方法,往方法里注入数据,把表单里的参数名和处理请求的方法的形参联系。如果一样,直接赋值;如果不一样,通过注解@RequestParam把表单里的参数值注入给形参。
返回一个字符串,返回给DispatcherServlet,从web工厂里拿出视图定位器,给字符串加上前缀和后缀,通过服务端跳转到装配的页面

login2知识点

  • 如果表单里的请求参数类型和方法里的形参不一致,它能自动进行转换
  • 可以通过new ModelAndView(new RedirectView("./index.jsp"));进行客户端跳转,不经过请求分派器

login3知识点
自动创建user对象,自动把表单里的同名参数封装到user对象的同名属性。类型不同会自动转换。然后自动把封装表单参数的user对象设到request内置对象里。属性名user,属性值user对象。

login4知识点
tomcat一启动首先创建监听器对象,对application对象创建做监听,application对象一创建就会自动把全局初始化参数封装到application对象里,然后监听器监听到application对象创建就调用Contextinitlize(),通过事件对象拿到application,从application对象里取得全局的初始化参数,通过参数名拿到参数值。拿到参数值后到WEB-INF下拿到applicationContext.xml配置信息,创建bean工厂,一创建bean工厂,业务对象就创建了,然后把bean工厂设到application里。
接着创建DispatcherServlet对象,通过读取servlet-name找到主配文件,创建web工厂。一创建web工厂就会创建三个对象,
(1)请求分派器
(2)后端控制器。通过注解找到后端控制器对象
(3)视图定位器
一创建后端控制器对象,给loginService属性(实例全局变量)注入数据,这个数据来自注解,从bean工厂里拿到id为loginService对象注入给后端控制器的loginService属性上

web工厂:创建请求分派器,视图定位器,后端控制器,异常处理器,上传分配器等
bean工厂:

你可能感兴趣的:(SpringMVC的login案例(注解方式)----2018-09-25)