Spring MVC @Controller控制器方法String字符串 的

Spring MVC @Controller

Spring MVC @RequestMapping   (一级目录)

控制器方法的返回值类型
  1.  String字符串
  2.  void
  3.  ModelAndView

 String字符串 类型

原来的方法(不好,不推荐,初学者才使用)

//指定逻辑视图名,经过视图解析器解析为JSP物理路径:/WEB-INF/pages/login.jsp 
@GetMapping("/login")
    public String getLogin() {
        return "login";
    }


//下面配置了视图解析器 所以return 返回的是一个不完整的, 或者说是一个用于待拼接的地址,是不完整的地址

<!-- 配置视图解析器 -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/pages/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>

改进的方法使用重定向和转发Forword and  Redirect

重定向和转发见:Servelet重定向和转发的区别_代码人生的博客-CSDN博客

1.转发的物理地址必须是完整地址,(如果转发本身的话)

2.或者转发到一个其他的控制器

关于跳转路径

在使用forwardredirect分别进行转发和重定向时,需要注意目标的路径,

这里涉及到绝对路径相对路径的问题。

  例如,在登录控制器的getLogin方法中使用return "forward:index.jsp"进行转

发,那么其最终的跳转路径为:

        跳转路径=当前路径+return中的路径,

        当前路径即为控制器方法所在路径,对于控制器类是

http://localhost:8080/WEB应用,因此最终跳转路径是

http://localhost:8080/WEB应用/index.jsp。

但是如果此时控制器所在的类上有@RequestMapping("/test")注解,则当前路

径就成为了http://localhost:8080/WEB应用/test,所以此时跳转目标是

http://localhost:8080/WEB应用/test/index.jsp,就会导致404错误。

因此,一般推荐使用绝对路径,即以/开头,控制器类的代码是跑在服务器

端的,因此/总是被解析为当前的WEB应用的根目录。

转发

//2.(1)不经过视图解析器,加标记,直接转发到其他的控制器
 @GetMapping("/login")
    public String getLogin() {

        return "forward :/regist";
    }

//  /regist代表在文件目录下面,即/bms后拼接,
//相当于跳转到http://localhost:8080/SpringMVC/regist
//但是地址还是http://localhost:8080/SpringMVC/login
  @GetMapping("/login")
    public String getLogin() {

        return "forward :regist";
    }
//2.(2)相当于跳转到http://localhost:8080/SpringMV/regist   把login进行替换掉了
//  regist代表在/login所在位置,  把login进行替换掉了
//但是地址还是http://localhost:8080/SpringMVC/login
//不能写 return "forword :login";  否则的话会一直递归,在/login下面进行循环

//3.加forword标记,直接到对应物理路径进行转发
  @GetMapping("/login")
    public String getLogin() {

        return "forward :/WEB-INF/pages/login.jsp";
    }

重定向

usercontroller类中

    @PostMapping("/login")
    public String dologin(@RequestParam("loginname")String loginname,@RequestParam("password")String password) {
		User user = userservice.selectLoginUser(loginname, password);
		System.out.println(user);
		if (user == null) {
			return "login";
		} else {
			if (user.getRole() == 1) {
				return "redirect:/manager/index";
                        //辅助跳转到ManagerController中,进行重定向,不能指定具体的物理地址跳转
                        // /WEB-INF/pages/manager/index.jsp  绝对不行
			} else {
				return "redirect:/reader/index";
                                //同理
			}
		}
    	
    }

ManagerController类

@Controller
@RequestMapping("/manager")
public class ManagerController {
	
@GetMapping("/index")
	public String doGetToManagerIndex() {
		
		return "manager/index";
             //最后在此处进行逻辑地址映射到配置文件当中的视图解析器进行拼接访问Manger的index页面  
	}
}


//方法二
@Controller
@RequestMapping("/reader")
public class ReaderController {
@GetMapping("/index")
public String doGetToReaderIndex() {
	
	return "forword:/WEB-INF/pages/reade/index.jsp";
}
	
}

ReaderController类

@Controller
@RequestMapping("/reader")
public class ReaderController {
@GetMapping("/index")
public String doGetToReaderIndex() {
	
	return "/reader/index";
//同理
}
	
}

小结:foword可以跳转具体物理地址,也可以跳转到别的控制器,Redirect 实现的只能是视图解析器进行拼接。

猜你喜欢

转载自blog.csdn.net/qq_53463161/article/details/121490280