SpringMVC-基础

SpringMVC和struts2的区别

    ①struts2的值栈和Action对内存的消耗很大,每个struts2请求都会创建一个值栈和Action;SprignMVC是请求处理器类单例,效率高

    ②Struts的核心控制器是Filter ; SpringMVC的核心控制器是Servlet

    ③Struts2兼容Spring需要插件 ; SpringMVC却天然支持

    ④Struts2不支持Restful风格 ; SpringMVC却天然支持

    ⑥Struts2用Ajax很繁琐 ; SpringMVC很简洁,用@ResponseBody即可

    ⑦Struts2标签结合OGNL表达式爽翻天,页面的开发效率很高

1、RequestMapping映射 

①根据请求方式映射

@RequestMapping(value="/testMethodMapping}", method=RequestMethod.GET)
@RequestMapping(value="/testMethodMapping",method=RequestMethod.POST)    //empID在from表单的请求参数里
@RequestMapping(value = "/list", method = {RequestMethod.POST, RequestMethod.GET}) 

②根据请求参数情况映射------[了解]

//请求参数中必须包含userName
@RequestMapping(value="/testParamersMapping}",params="userName")
    
//请求参数中不能包含userName
@RequestMapping(value="/testParamersMapping}",params="!userName")
    
//请求参数中必须包含userName且值必须为Tom
@RequestMapping(value="/testParamersMapping}",params="userName=Tom")
    
//请求参数中必须包含userName但值不能为Tom
@RequestMapping(value="/testParamersMapping}",params="userName=!Tom")
    
//请求参数中必须包含userName且值为Tom2015,同时必须包含userPwd但值不限
@RequestMapping(value="/testParamersMapping}",params={"userName=Tom2015","userPwd"}) 

③根据请求消息头内容映射------[了解]

//根据请求消息头必须为:Accept-Language:zh-CN,zh;q=0.8映射
@RequestMapping (value="/testHeaderMapping}",headers= "Accept-Language=zh-CN,en;q=0.8")

④使用Ant风格通配符

//映射单个字符  可以处理 value="/testSingleWord_a"    value="testSingleWord_b"   value="testSingleWord_c" ......的请求
@RequestMapping(value="/testSingleWord_?")
    
//映射多个字符  可以处理 value="/testMultiWord_apple"  value="testMultiWord_asf" ......的请求
@RequestMapping(value="/testMultiWord_*")
    
//映射多级目录  可以处理 value="/testMultiFolder"  value="/testMultiFolder/happy"  value="/testMultiFolder/happy/good"......的请求
@RequestMapping(value="/testMultiFolder/**")
2、获取请求参数 

①@RequestParam注解  

@RequestMapping("/testRequestParam")
public String testParam(@RequestParam(value="empName",required=false) String empName) { 
     #获取 empName 这个参数
}

②从URL地址中通过通配符获取匹配的数据 

@RequestMapping(value="/emp/{empId}", method=RequestMethod.GET)
public String editEmp(@PathVariable("empId") String id) { 
     #从Url地址中获取请求参数
}

③将请求参数注入到POJO中  

@RequestMapping(value="/emp")
public String saveEmp(Employee employee) { }

④获取请求消息头或Cookie

@RequestMapping("/testGetOther")
public String getOtherValue(@RequestHeader("User-Agent") String userAgent, @CookieValue("JSESSIONID") String cookieValue) {
    //@RequestHeader("User-Agent") 获取请求消息头中的 User-Agent信息 赋值给userAgent
    //@CookieValue("JSESSIONID")  获取Cookie中的 JSSIONID信息 赋值给cookieValue
}
3、经过处理请求后携带资源的视图跳转 
@RequestMapping(value="/showList01")
public String showList01e(HttpServltRequest request){
request.setAttribute("list", list);
    return "showList";  
}
    
@RequestMapping(value="/showList02")
public String showList02(Map<String,Object> map){
    map.put("list", list);
    return "showList";
}
    
@RequestMapping(value="/showList03")
public String showList03(Model model){
    model.addAttribute("list", list);
    return "showList";
}

@RequestMapping(value="/showList04")
public String showList04(ModelMap modelMap){
    modelMap.addAttribute("list", list);
    return "showList";
}

@RequestMapping(value="/showList05")
    public ModelAndView showList05(){
    ModelAndView modelAndView = new ModelAndView("showList");
    modelAndView.addObject("list", list);
    return modelAndView;
}
4、SpringMVC Controller重定向 
//重定向1  model.addAttribute("payResult", payResult);model中的数据获取不到
response.sendRedirect(request.getContextPath()+"/H5DemoPay.jsp");

//重定向2 model.addAttribute("payResult", payResult);model中的数据以?payResult=xxxxxx的形式传递过去
return "redirect:/H5DemoPay.jsp";

//将页面写出来
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.getWriter().write(payResult);   //payResult若是一个HTML页面 则把整个页面就写出来了
5、SpringMVC Controller转发
//转发1 推荐使用  转发到 配置好的前后缀的页面
model.addAttribute("payResult", payResult);
return "H5DemoPay";
//转发2 可以转发到不是配置好的前后缀的页面      
model.addAttribute("payResult", payResult);
return "forward:/H5DemoPay.jsp";
//转发3 此种转发会出现url多一层目录的情况  /shop/H5/H5DemoPay.jsp   多一个(/H5)目录
model.addAttribute("payResult", payResult);
httpServletRequest.getRequestDispatcher("/H5DemoPay.jsp").forward(httpServletRequest,httpServletResponse);
6、forward:和 redirect:
//  一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。
//  如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理:将forward:和 redirect:当成指示符,
//  其后的字符串可以是jsp页面,也可以是url地址跳转到另一个controller
@RequestMapping(value="/testForward")
public String testForward(){
    return "forward:/views/login.jsp";  //转发到一个页面
    return "forward:/demo/scanPay";    //转发到另一个controller 会携带此controller里的request的参数(因为是转发是同一个请求)
}
@RequestMapping(value="/testRedirect")
public String testReddirect(){
    return "redirect:/views/login.jsp";    //重定向到一个页面 
    return "redirect:/demo/scanPay";       //重定向到一个controller
}
7、SpringMVC基础配置
<!-- 配置一个最常用的视图解析器 -->
    <bean id="viweResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
<!-- 配置自定义视图 -->

    <!-- 配置自定义视图对应的bean -->
    <bean id="myViews" class="com.atguigu.spring.view.MyView" />

    <!-- 配置 自定义的视图解析器 :BeanNameViewResolver-->
    <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <!-- 数值越小视图解析器的优先级别越高 -->
        <property name="order" value="20"></property>
    </bean>


<!-- URL地址不经过handler直接访问WEB——INF下的页面 -->
    <!-- 配置通过URL地址直接访问jsp不通过handler,比如访问WEB-INF下的页面 ,比如登录页面,不转发的话到不了WEB-INF下 -->
        <a href="${pageContext.request.contextPath}/toLOginPage"></a>
    <!-- path属性:浏览器发送的URL地址 -->      <!-- view-name属性:视图名称 -->
    <!-- 关于视图的两个概念:逻辑视图:login——视图的名称(jsp的名称)    
                            物理视图:WEB-INF/views/login.jsp -->
    <!-- 此时如果只有<mvc:view-controller>标签的话,那么其他请求就会失效,所以需要增加一个额外的配置,<mvc:annotation-driver>标签来配合使用-->
    <mvc:view-controller path="/toLoginPage" view-name="login"/>
    <mvc:annotation-driven />    //配合使用


<!-- 为了能让项目中的静态资源可以被正常访问,需要加入如下配置 -->
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven />    //配合使用

8、SpringMVC-Restful

Restful风格的URL地址

保存:http://localhost:8080/CRUD/emp      POST请求      http://localhost:8080/CRUD/saveEmp
删除:http://localhost:8080/CRUD/emp/2    DELETE请求    http://localhost:8080/CRUD/removeEmp?empId=2
修改:http://localhost:8080/CRUD/emp      PUT请求       http://localhost:8080/CRUD/updateEmp
查询:http://localhost:8080/CRUD/emp/2    GET请求       http://localhost:8080/CRUD/getEmp?empId=2
将GET请求转化为DELETE请求
<!--所有的超级连接都是get请求,将get请求变为DELETE请求办法:再由jQuery将超级连接添加到表单的action并提交,此时仍然为post请求
 写一个post请求表单,携带隐藏<input type="hidden" name="_method" value="DELETE" />,经由一个HiddenHttpMethodFilter过滤将改成DELETE请求,-->

<a class="removeEmp"  href="${pageContext.request.contextPath }/emp/${emp.empId }">删除</a></td>
<form action="" method="post">
    <input type="hidden" name="_method" value="DELETE"/>
</form>

$(function(){
    //获取所有的删除超级链接对应的元素节点对象,并绑定响应的单机响应函数
    $(".removeEmp").click(function(){
        //获取空的from表单
        var $form = $("form");
        //把表单的action属性值设置为当前超级链接的href属性值
        $form[0].action=this.href; 
        //提交空的表单,此时表单请求为post请求,前往HiddenHttpMethodFilter改成DELETE请求
        $form.submit(); 
        //取消超级链接的默认跳转行为
        return false;      
    });
});

//这个过滤器可以拦截所有的资源,将表单的POST请求转换为PUT请求或DELETE请求
<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

猜你喜欢

转载自blog.csdn.net/wxd_1024/article/details/80086319