• SpringMVC控制器与视图的数据交换


    1,先创建spring的主配置文件(applicationContaxt.xml如果写在WEB-INF下,就不用配置context了,就是不用告诉它路径了,WEB-INF会自动加载的),由监听器负责加载 ,导入类库,添加spring支持

    2,stru2的核心控制器就是咱自己写的Action  视图就是jsp  模型:数据访问层、业务逻辑层、实体类  StrutsPrepareAndExecuteFilter

    3,SpringMVC:先在web.xml中配置核心控制器:添加servlet,DispatcherServlet类 需要加载SpringMVC自身配置文件   伪静态  *.html  叫后缀匹配

    4,SpringMVC配置文件:在加载主配置文件下,自动加载springmvc配置文件。必须建在WEB-INF下,文件名{servletName}-servlet.xml一个都不能写错,  servletName是我在web.xml中自己起的名字,核心控制器负责加载

    5,两个配置文件会产生两个IOC容器 applicationContaxt.xml是主容器;SpringMVC配置文件是子容器

    可以把公共的bean配置在主容器中,子可以用主,但主不能用子

     

    第一步,把controller配置成由spring管理的bean    @Controller("helloController")
    第二步,调用 @RequestMapping("/") @RequestMapping("hello")



    第一点不同:


    //struts2中处理请求的方法,必须是公共的,返回字符串,无参的
    public String execute() throws Exception { //从session中获取当前添加机器故障的用户 User user = (User)sessionMap.get("user"); //为Problem添加用户 problem.setUser(user); //调用service保存problem problemService.saveProblem(problem); return SUCCESS; }
    第二点不同:
    一个类中只能写一个方法,然后去struts.xml中配置命名空间 增删改查四个acction

    <!-- 后台故障登记 -->
        <package name="problem-add" namespace="/background/regist" extends="default">
            <!-- 添加故障登记 -->
            <action name="add" class="cn.bdqn.problem.action.problem.AddProblemAction" >
            如果返回succuss结果,就执行result中的指令
                <result type="redirectAction">
                    <param name="namespace">/background/reply</param>
                    <param name="actionName">list</param>            
                </result>
            </action>
        </package>


    //springMVC可以返回多种类型的结果,方法可以有参数,十分灵活
    //controller必须添加到ioc容器中,变成spring中的bean---->加注解
    //一个类可以添加多个方法,一个方法就是一个url路径
    //
    第三点不同:一律先走控制器,由控制器处理请求,再调用视图显示而避免浏览器直接调用视图。在WEB-INF下新建一个目录view,因为在webroot下可以直接访问action,WEB-INF是不能被浏览器直接访问的,必须得先走控制器,再走jsp页面
    struts2:jsp写在webroot下,MyBatis:jsp写在WEB-INT下
    package cn.bdqn.mvc.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller("helloController")
    @RequestMapping("/")//写/代表hellocontroller中的方法都是在webroot下访问的
    public class HelloController {
    	//http://localhost:8080/MVC/hello.html
    	@RequestMapping("hello")//通过hello这个名字进行访问
    	public String hello() {
    		return "hello";   //   返回字符串叫返回视图名称 
    	}
    一、从控制器向视图传递数据
    1.通过返回ModelAndView对象向视图传递数据------每次向页面传不同的内容
    public ModelAndView hello1() {
            ModelAndView mav=new ModelAndView("hello");
            mav=mav.addObject("Message","HelloWorld!");//这么一写,就自动存在请求作用域中
            
            return mav;
        }
    2.通过传入HttpServletRequest对象直接操作请求作用域------每次向页面传不同的内容
    //也可以直接存到请求作用域中,不用通过ModelAndView对象了
        public String hello(HttpServletRequest request) {//由于spring比较灵活,只需要把对象当参数放进去方法中,就会自动成对象了
            request.setAttribute("Message","HelloWorld!");
            return "hello";
        }
    3.通过在Controller的方法上添加@ModelAttribute注解
      将方法的返回值加入模型
    public HelloController() {//Controller默认只创建一个对象,因为spring默认是singlton。
            System.out.println("调用了HelloController无参构造方法");
        }
        //每次请求固定的传递的数据,可以定义Controller类的get方法,比如不管访问哪儿,都固定的向页面传递你访问网站的标题,每次向页面传相同的内容
        @ModelAttribute("title")//会先被SpringMVC调用, 把方法的返回值添加到模型中(也就意味着添加到请求作用域中)
        public String getTitle(){
            return "SpringMVC教程";
        }

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/view/"
        p:suffix=".jsp"

    />

     二、从视图向控制器提交数据
    1.通过控制器的方法参数接收表单数据

    @RequestMapping(value="login",method=RequestMethod.GET)
    	public String showLogin(){
    		
    		return "login";
    	}
    	/**但是现在有个问题,显示和提交的路径一致,啥时候执行第一个(以get请求),啥时候执行第二个(以post请求)*/
    	//表单提交  不需要定义另外的提交路径,还让他提交回login.html。是默认的   表单字段少可以采用这种方式接受
    	@RequestMapping(value="login",method=RequestMethod.POST)
    	public String doLogin(String loginName,String password){
    		System.out.println("登录名:"+loginName);
    		System.out.println("密码:"+password);
    		return "hello";
    	}
    


    2.通过Java对象封装表单提交的数据

    //建议不用实体类接受请求,建议单独定义一个表单类
    	@RequestMapping(value="login",method=RequestMethod.POST)
    	public String doLogin2(LoginForm loginForm){
    		System.out.println("登录名:"+loginForm.getLoginName());
    		System.out.println("密码:"+loginForm.getPassword());
    		return "hello";
    	}


    struts2中,是把接收数据的属性声明在类中,springMVC是通过方法的参数
  • 相关阅读:
    dockercompose方式安装的gitlabce升级到极狐gitlab
    卷影删除小结
    常用BypassUAC和GetSystem备忘
    【云原生】Kubernetes PDB(Pod Disruption Budget)介绍与简单使用
    【云原生】Kubernetes CRD 详解(Custom Resource Definition)
    【云原生】Prometheus+Grafana on K8s 环境部署
    【云原生】Kubernetes 有状态应用程序控制器 Operator
    【云原生】Prometheus+Grafana 监控 k8s 资源实战操作
    【云原生】Helm 常用命令(chart 安装、升级、回滚、卸载等操作)
    QTOpenGL绘制三角形
  • 原文地址:https://www.cnblogs.com/Angelinas/p/5596197.html
Copyright © 2020-2023  润新知