SpringMVC-请求转发和重定向

    (1)在后台一个controller跳转到另一个controller,从一个列表页面,然后我会进行新增操作,新增在后台完成之后我要跳转到列表页面,不需要传递参数,列表页面默认查询所有的。

        方式一:使用ModelAndView
        return new ModelAndView("redirect:/toList");
        这样可以重定向到toList这个方法
        方式二:返回String
                    return "redirect:/ toList "; 
        其它方式:其它方式还有很多,这里不再做介绍了,比如说response等等。这是不带参数的重定向。

    (2)第二种情况,列表页面有查询条件,跳转后我的查询条件不能丢掉,这样就需要带参数的了,带参数可以拼接url

        方式一:自己手动拼接url

                    new ModelAndView("redirect:/toList?param1="+value1+"&param2="+value2);
                    这样有个弊端,就是传中文可能会有乱码问题。

        方式二:用RedirectAttributes,这个是发现的一个比较好用的一个类
                    这里用它的addAttribute方法,这个实际上重定向过去以后你看url,是它自动给你拼了你的url。
                    使用方法:

                     attr.addAttribute("param", value);
                    return "redirect:/namespace/toController";
                    这样在toController这个方法中就可以通过获得参数的方式获得这个参数,再传递到页面。过去的url还是和方式一一样的。

    (3)带参数不拼接url页面也能拿到值(重点是这个)
            一般我估计重定向到都想用这种方式:

            

package com.jikexueyuan.demo.controller;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.jikexueyuan.demo.common.PageParam;
import com.jikexueyuan.demo.entity.TableStudent;
import com.jikexueyuan.demo.service.TableStudentService;

@Controller
@RequestMapping("/stu")
public class StudentController {
	@Resource
	private TableStudentService studentService;
	
	@RequestMapping(value="listStu",method=RequestMethod.GET)
	public String listStu(HttpServletRequest request,Model model) {
		int currPage=1;
		try {
			currPage=Integer.parseInt(request.getAttribute("page").toString());
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		// 获取总记录数
		int rowCount = studentService.getRowCount();
		PageParam pageParam = new PageParam();
		pageParam.setRowCount(rowCount);
		if (pageParam.getTotalPage() < currPage) {
			currPage = pageParam.getTotalPage();
		}
		pageParam.setCurrPage(currPage);
		pageParam=studentService.getStudentListByPage(pageParam);
		model.addAttribute("pageParam", pageParam);
		return "stuList";
	}
	
	@RequestMapping("/forwardStuAddPage")
	public String forwardStuAddPage(){
		// return "forward:/stuAdd" => 转发到能够匹配 /hello 的 controller 上  
	    // return "stuAdd" => 实际上还是转发,只不过是框架会找到该逻辑视图名对应的 View 并渲染  
	    // return "/stuAdd" => 同 return "stuAdd"  
		return "stuAdd";
	}
	
	@RequestMapping(value="addStu",method=RequestMethod.POST)
	//@ModelAttribute("stu") TableStudent stu => TableStudent stu
	public String addStu(@ModelAttribute("stu") TableStudent stu,RedirectAttributes attr,HttpServletRequest request){
		studentService.addStu(stu);
		//springmvc使用addFlashAttribute,参数不会出现在url地址栏中
		//attr.addFlashAttribute("page", 1); => session.setAttribute("page",1);
		//这里的原理是放在session的,因为重定向request.setAttribute("","")是那拿不到值得,所以放在session,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉
		attr.addFlashAttribute("page", 1);
		//attr.addAttribute 相当于拼接URL,重定向后参数会显示在url上
		//attr.addAttribute("page", 1);
		//我这里ViewResolver的后缀是html
		return "redirect:/stu/listStu.html";
	}
}

页面取值不用我说了吧,直接用el表达式就能获得到,这里的原理是放到session中,session在跳到页面后马上移除对象。所以你刷新一下后这个值就会丢掉
3. 总结
    最底层还是两种跳转,只是spring又进行了封装而已,所以说跳转的方式其实有很多很多种,你自己也可以封一个,也可以用最原始的response来,也没有问题。好了,就到这儿。

    其实也没有什么,但是知道了这个就很简单了,之前没搞懂,现在搞懂了,和大家分享。有问题的给我留言。

发布了53 篇原创文章 · 获赞 21 · 访问量 20万+
展开阅读全文

springboot如何将https的get请求转换为post请求

11-06

springboot项目 绑定了https协议 但是http的post请求后自动转换成https请求get请求 请问大佬如和将https的get请求转换为post请求 ``` @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() { @Override protected void postProcessContext(Context context) { //Due to CONFIDENTIAL and /*, this will cause Tomcat to redirect every request to HTTPS. //You can configure multiple patterns and multiple constraints if you need more control over what is and is not redirected. SecurityConstraint constraint = new SecurityConstraint(); constraint.setUserConstraint("CONFIDENTIAL"); SecurityCollection collection = new SecurityCollection(); collection.addPattern("/*"); constraint.addCollection(collection); context.addConstraint(constraint); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } @Bean public Connector httpConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); //Set the scheme that will be assigned to requests received through this connector //@param scheme The new scheme connector.setScheme("http"); //Set the port number on which we listen for requests. // @param port The new port number connector.setPort(80); //Set the secure connection flag that will be assigned to requests received through this connector. //@param secure The new secure connection flag //if connector.setSecure(true),the http use the http and https use the https;else if connector.setSecure(false),the http redirect to https; connector.setSecure(false); //redirectPort The redirect port number (non-SSL to SSL) connector.setRedirectPort(443); return connector; } @Override public void run(String... arg0) throws Exception { // TODO Auto-generated method stub } ``` 配置文件 ``` server.port: 443 server.ssl.key-store: classpath:tomcat.keystore server.ssl.key-store-password: 123456 server.ssl.keyStoreType: JKS server.ssl.keyAlias: tomcat ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览