springmvc学习

SpringMVC框架完整学习指南 《SpringMVC框架完整学习指南》摘要 本文全面介绍了SpringMVC框架的核心内容,包含15个章节的系统知识体系: 基础概念 SpringMVC是Spring框架的Web模块,基于MVC模式 核心优势:轻量级、注解驱动、RESTful支持 核心组件 DispatcherServlet:前端控制器 五大核心组件:HandlerMapping、HandlerAdapter等 详细工作流程解析 开发实践 环境搭建:XML与Java配置 Controller开发:4种返回值类型 请求映射:@RequestM 阅读详情

你看到的逆袭,不过是一场预备

springmvc入门学习笔记

目录

1丶springmvc原理

2丶搭建环境

3丶入门例子

4丶注解开发

5丶参数绑定

6丶数据回显

7丶json交互

8丶controller三种返回值

9丶restful风格

10丶全局异常

11丶上传图片

12丶拦截器

13丶springmvc和strtus2区别

14丶处理get和post乱码

详细知识点

1.1springmvc web框架

springmvcSpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,将Web层进行职责解耦,继承httpServlet,封装扩展了servlet,开发效率比一般servlet高,但一般servlet性能好。
spring体系下的:springmvcheima1/WebContent/WEB-INF/lib/spring-webmvc-4.1.3.RELEASE.jar
用途:接收浏览器的请求响应,对数据进行处理,然后返回页面进行显示。

1.2

构成:四大器,即前端控制器,处理器适配器,处理器映射器,视图解析器。
作用流程:
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、 DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户

2.1搭建环境

导包:
在这里插入图片描述
创建web-xml----------->创建springmvc.xml------->视图jsp---------->pojo---------->编写controller
web.xml tomcat启动加载web-xml,再加载springmvc.xml继续加载

3.1 web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>springmvcheima1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>spirngMvcheima1</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:SpringMvc.xml</param-value>
    </init-param>
    <!-- 1 2 3.....代表第几个启动 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spirngMvcheima1</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>
</web-app>

springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://code.alibabatech.com/schema/dubbo 
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.0.xsd">
        
<!-- 配置@Controller注解扫描 -->
<context:component-scan base-package="cn.itheima.controller"></context:component-scan>
        
        <!-- 如果没有显示的配置处理器映射器和处理器适配那么springMvc会去默认的dispatcherServlet.properties中查找对应的处理器映射器和处理器适配器去使用,这样每个请求都要扫描一次他的默认配置文件,效率非常低,会降低访问速度,所以要显示的配置处理器映射器和处理器适配器 -->
        <!-- 注解形式的处理器映射器 -->
		<!--         <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">     </bean> -->
        <!-- 注解形式的处理器适配器 -->
        <!--         <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">    </bean> -->
        
        <!-- 配置最新版的注解的处理器映射器 -->
        <!--         <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> -->
        <!-- 配置最新版的注解的处理器适配器 -->
        <!--         <bean  class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> -->

<!-- 注解驱动:	作用:替我们自动配置最新版的注解的处理器映射器和处理器适配器     -->	
<mvc:annotation-driven></mvc:annotation-driven>
	
	
	
<!-- 配置视图解析器 作用:在controller中指定页面路径的时候就不用写页面的完整路径名称了,可以直接写页面去掉扩展名的名称	-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<!-- 真正的页面路径 =  前缀 + 去掉后缀名的页面名称 + 后缀 -->
	<!-- 前缀 -->
	<property name="prefix" value="/WEB-INF/jsp/"></property>
	<!-- 后缀 -->
	<property name="suffix" value=".jsp"></property>
</bean>
	
</beans>

controller

@Controller
public class ItemsController {
	//静态模拟
	//指定url到请求方法的映射
	//url中输入一个地址,找到这个方法.例如:localhost:8080/springmvcheima1/list.action
	@RequestMapping("/list")
	public ModelAndView  itemsList() throws Exception{
		List<Items> itemList = new ArrayList<>();
		
		//商品列表
		Items items_1 = new Items();
		items_1.setName("联想笔记本_3");
		items_1.setPrice(6000);
		items_1.setDetail("联想笔记本电脑!");
		
		Items items_2 = new Items();
		items_2.setName("苹果手机");
		items_2.setPrice(5000f);
		items_2.setDetail("苹果手机!");
		
		itemList.add(items_1);
		itemList.add(items_2);
		
		//模型和视图
		//model模型: 模型对象中存放了返回给页面的数据
		//view视图: 视图对象中指定了返回的页面的位置
		ModelAndView modelAndView = new ModelAndView();
		
		//将返回给页面的数据放入模型和视图对象中
		modelAndView.addObject("itemList", itemList);
		
		//指定返回的页面位置
		modelAndView.setViewName("itemList");
		//视图中用<c:forEach items="${itemList }" var="item">  ${item.name }    ${item.price }
		return modelAndView;

	}
4.1注解开发

@Controller @RequestMapping @ModelAttribute @SessionAttributes @PathVariable @RequestParam
@ResponseBody @RequestBody

@Controller
Controller处理由DispatcherServlet分发的请求,主要流程为:Controller调用业务处理层处理后封装成一个model,该注解标记到一个类上,说明是一个控制器类。
@RequestMapping
处理请求地址的映射,可以用在类或者方法中,这样访问的地址就得加上本注解的值,属性有value,method 等。
    @RequestMapping ( "/test/{variable1}" )
    public class MyController {
       @RequestMapping ( "/showView/{variable2}" )
       public ModelAndView showView( @PathVariable String  variable1, @PathVariable ( "variable2" ) 
@ModelAttribute
两种方式:一种标注在方法上,一种标注到方法参数上
该注解的方法会先执行,把返回的对象存在session或者模型属性中,如模型属性(ModelAttribute("attributeName")),若未指定,返回的是类名称(首字母小写)作为属性名称,再执行真正请求的方法
	@ModelAttribute("tmodel")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf");
	    return t;
	}
		@RequestMapping("item")
	public TModel t(){
	    TModel t = new TModel();t.setEmail("dfdafdasf");
	    return t;
	}
	@ModelAttribute单独在方法上使用,同时结合@ModelAttribute使用在形参上
    	@ModelAttribute("tmodel")
    	public TModel t(){
    	    TModel t = new TModel();t.setEmail("dfdafdasf1");
    	    return t;
    	}
    	    @RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
    	    public String f3(@ModelAttribute("tmodel") TModel email){
    	        return "migucactivites/migucactivites_config";
    	    }
这种情况下,根据debug,也是在requestmapping处理完毕以后,才真正写入到session中的。
但是,这里spring Mvc做了处理,在形参处,可以获取到在t方法中设置的tmodel值。虽然此时session中其实没有这个内容。
@SessionAttributes
	@SessionAttributes只能使用在类定义上。
    若希望在多个请求之间共用某个模型属性数据,则可以在
    控制器类上标注一个 @SessionAttributes, Spring MVC
	将在模型中对应的属性暂存到 HttpSession 中
 @SessionAttributes(value={"names"},types={Integer.class})
  @Controller
  public class Test {
    @RequestMapping("/test")
     public String test(Map<String,Object> map){
        map.put("names", Arrays.asList("caoyc","zhh","cjx"));
        map.put("age", 18);
        return "hello";
    }
}
两者一起用:
@Controller
@RequestMapping(value = "/migucactivites")
@SessionAttributes("tmodel")
public class MigucActivityController {	    
        @RequestMapping(value = "/activity_view2", method = RequestMethod.GET)
	    public String f3(@ModelAttribute("tmodel") TModel email){
	        return "migucactivites/migucactivites_config";
	    }
}
这种情况下,@ModelAttribute一定会去session中找对应的tmodel对象。如果找不到,就会报错,请求在后台直接抛出异常。
如果session中有tmodel对象,传入连接中没有传入email字段,则email直接得到的是session中值,并且会把值再set回model中,并放到session中。
如果session中有tmodel对象,并且传入参数也有email值。例如url:http://127.0.0.1:8081/migucactivites/activity_view2.htm?email=2d,这种情况下,代码email的值为2d,并且也会把tmodel=2d放到model中,放到session中

@PathVariable
@RequestParam
    @pathVariable("pageSize") 	需要配合rest风格url使用,目的是接收rest Url中的参数 	http://127.0.0.1:8082/hello/4
    @RequestParam((value = "pageSize", required = false, defaultValue = "10")) 	接收普通?后面携带的参数 	http://127.0.0.1:8082/hello?pageSize=4
    @RequestMapping(value = "/hello/{pageSize}", method = RequestMethod.GET)
    public String say(@PathVariable("pageSize") String pageSize) {
        return pageSize;
    }
    @RequestMapping(value = "/hello", method = RequestMethod.GET)
    public String say2(@RequestParam(value = "pageSize", required = false, defaultValue = "10") String pageSize) {
        return pageSize;
    }
@ResponseBody
@RequestBody  
	//请求json串(商品信息),输出json(商品信息)
	//@RequestBody将请求的商品信息的json串转成itemsCustom对象
	//@ResponseBody将itemsCustom转成json输出
	@RequestMapping("/requestJson")
	public @ResponseBody ItemsCustom requestJson(@RequestBody ItemsCustom itemsCustom){
		//@ResponseBody将itemsCustom转成json输出
		return itemsCustom;
	}
	//请求key/value,输出json
	@RequestMapping("/responseJson")
	public @ResponseBody ItemsCustom responseJson(ItemsCustom itemsCustom){
		//@ResponseBody将itemsCustom转成json输出
		return itemsCustom;
	}
@RequestHeader
@CookieValue
    可以把Request请求header部分的值绑定到方法的参数上。
5.1参数绑定

意思:把客服端传过来的数据如key/value的数据,绑定到controller中方法的形参上,则此过程名为参数绑定。
适配器中注入参数绑定。
1:默认支持的参数绑定类型:
HttpServletRequest HttpServletResponse HttpSession Modelj接口 ModelMap实现类.

直接在controller的方法参数上加入HttpServletRequest对象,用途将前端传过来的数据封装到域中.
public ModelAndView queryItems(Model model)
如model.addAttribute("user", user);

:2:简单参数绑定:
在springmvc方法中不用传入的参数名称和方法参数名称一致,可以用@RequestParam来绑定简单类型参数,如果不用此注解,则必须一致。
传入参数和形参一致的情况:

    @RequestMapping("/updateitem1")
    //没用request.getParameter(id);都可以获取到传入的值。
    public String update1(Integer id, String name, Float price, String detail) throws Exception {
        Items items = new Items();
        items.setId(id);
        items.setName(name);
        items.setPrice(price);
        items.setDetail(detail);
        itemsService.updateItems(items);
        return "success";
    }
    jsp:
	<form id="itemForm"    action="${pageContext.request.contextPath }/updateitem1.action" method="post">
        <input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
        <table width="100%" border=1>
            <tr>
                <td>商品名称</td>
                <td><input type="text" name="name" value="${item.name }" /></td>
            </tr>
            ....price detail 

用注解不一致的情况:

	@RequestMapping(value = "/editItems", method = { RequestMethod.POST,RequestMethod.GET })
	// @RequestParam里边指定request传入参数名称和形参进行绑定,本例中id和items_id绑定。
	// 通过required属性指定参数是否必须要传入
	// 通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
	public String editItems(Model model,@RequestParam(value = "id", required = true) Integer items_id) throws Exception {

		// 调用service根据商品id查询商品信息
		ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
		// 通过形参中的model将model数据传到页面
		// 相当于modelAndView.addObject方法
		model.addAttribute("items", itemsCustom);

		return "items/editItems";
	}

3:pojo绑定:
需要页面上的input中的name属性和pojo属性名一致。

实体类User.java
package cn.itheima.pojo;
import java.util.Date;
public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username == null ? null : username.trim();
    }
    public Date getBirthday() {
        return birthday;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex == null ? null : sex.trim();
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address == null ? null : address.trim();
    }
}
editItem.jsp
<form id="itemForm"    action="${pageContext.request.contextPath }/updateitem2.action" method="post">
        <input type="hidden" name="id" value="${item.id }" /> 修改商品信息:
        <table width="100%" border=1>
            <tr>
                <td>商品名称</td>
                <td><input type="text" name="name" value="${item.name }" /></td>
            </tr>
            <tr>
                <td>商品价格</td>
                <td><input type="text" name="price" value="${item.price }" /></td>
            </tr>
            <tr>
                <td>商品简介</td>
                <td><textarea rows="3" cols="30" name="detail">${item.detail }</textarea>
                </td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" value="提交" />
                </td>
            </tr>
        </table>
    </form>
Controller:
    @RequestMapping("/updateitem2")
    public String update2(Items items) throws Exception {
    //Items /pojo类中的属性和input中属性需一致
        itemsService.updateItems(items);
        return "success";
    }

4:包装pojo类型绑定:

jsp:
<input name="itemsCustom.name">
controller;
public ModelAndView 	queryItems(HttpServletRequest request,ItemsQueryVo itemsQueryVo);
pojo包装:
public class ItemsQueryVo
{
	private Items items;
	//此属性.属性为input输出的name
	private ItemsCustom itemsCustom;
}

5:数组类型参数绑定

例如批量删除
input和形参相同items_id  
将多个商品的id传给controller方法的形参,这个形参就是数组
controller:
// 批量删除 商品信息
	@RequestMapping("/deleteItems")
	public String deleteItems(Integer[] items_id) throws Exception {
		// 调用service批量删除商品
		// ...
		return "success";
	}
	jsp:
	<td><input type="checkbox" name="items_id"         value="${item.id}"/></td>

6:list类型参数绑定

jsp页面传入的数据和形参绑定起来,形参用包装类,方法体中用存包装类的list集合接收
input中name和vo中属性一致
controller:
	@RequestMapping("/editItemsQuery")
	public ModelAndView editItemsQuery(HttpServletRequest request,
		ItemsQueryVo itemsQueryVo) throws Exception {
		// 调用service查找 数据库,查询商品列表
		List<ItemsCustom> itemsList = itemsService.findItemsList(itemsQueryVo);
		// 返回ModelAndView
		ModelAndView modelAndView = new ModelAndView();
		// 相当 于request的setAttribut,在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);
		modelAndView.setViewName("items/editItemsQuery");
		return modelAndView;
	}
jsp:
<c:forEach items="${itemsList }" var="item" varStatus="status">
<tr>	
	<td><input name="itemsList[${status.index }].name" value="${item.name }"/></td>
	<td><input name="itemsList[${status.index }].price" value="${item.price }"/></td>
	<td><input name="itemsList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
	<td><input name="itemsList[${status.index }].detail" value="${item.detail }"/></td>
</tr>
</c:forEach>
	// 批量修改商品提交
	// 通过ItemsQueryVo接收批量提交的商品信息,将商品信息存储到itemsQueryVo中itemsList属性中。
	@RequestMapping("/editItemsAllSubmit")
	public String editItemsAllSubmit(ItemsQueryVo itemsQueryVo)
			throws Exception {

		return "success";
	}

7:自定义参数绑定:
如日期类型,将页面输入中的日期字符串转化为pojo中日期属性类型,即java.util.Data类型。

public class CustomGlobalStrToDateConverter implements Converter<String, Date> {

	@Override
	public Date convert(String source) {
		try {
			Date date = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(source);
			return date;
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	springmvc中:
		<!-- 配置自定义转换器 
	注意: 一定要将自定义的转换器配置到注解驱动上
	-->
	<bean id="conversionService"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<!-- 指定自定义转换器的全路径名称 -->
				<bean class="cn.itheima.controller.converter.CustomGlobalStrToDateConverter"/>
			</set>
		</property>
	</bean>
6.1数据回显

springmvc默认回显pojo
pojo数据用input输入传到方法中,springmvc自动回显到input中,数据自动存到request域中,key为小写的pijo类名。
@modelAttribute制定pojo回显到页面在request中的key。

public String editItemSubmit(Model model , @ModelAttribute("item") ItemsCustom itemsCustom)
<td><input type="text"name="name" value="${item.name}"/></td>
如果不用@ModelAttribute也可以使用model.addAttribute("item", itemsCustom)完成数据回显。

@modelAttribute可以将方法的返回值传到页面。

   @ModelAttribute("itemtypes")
      public Map<String, String>getItemTypes(){
        Map<String,String> itemTypes = new HashMap<String,String>();
        itemTypes.put("101", "数码");
        itemTypes.put("102", "母婴")
        return itemTypes;
      }
<select name="itemtype">
   <c:forEach items="${itemtypes }" var="itemtype">
      <option value="${itemtype.key}">${itemtype.value }</option>   
   </c:forEach>
</select>
7.1json数据交互

导包

	//导入jackson的jar包在 controller的方法中可以使用@RequestBody,让spirngMvc将json格式字符串自动转换成java中  的pojo
	//页面json的key要等于java中pojo的属性名称
	//controller方法返回pojo类型的对象并且用@ResponseBody注解,springMvc会自动将pojo对象转换成json格式字符串
	@RequestMapping("/sendJson")
	@ResponseBody
	public Items json(@RequestBody Items items) throws Exception{
		System.out.println(items);
		return items;
	}
	<script type="text/javascript">
	function sendJson(){
		//请求json响应json
		$.ajax({
			type:"post",
			url:"${pageContext.request.contextPath }/items/sendJson.action",
			contentType:"application/json;charset=utf-8",
			data:'{"name":"测试商品","price":99.9}',
			success:function(data){
				alert(data);
			}
		});
	}
8.1controller方法返回值

1:modelAndView
modelAndView.addObject(“itemList”,list);
modelAndView.setViewName(“itemList”);
2:String
页面的逻辑视图名

//返回数据
    request.setAttribute("", arg1);
		//指定返回的页面(如果controller方法返回值为void,则不走springMvc组件,所以要写页面的完整路径名称)
	request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);
		
		     ]//重定向:浏览器中url发生改变,request域中的数据不可以带到重定向后的方法中
	model.addAttribute("id", items.getId());
		     //在springMvc中凡是以redirect:字符串开头的都为重定向
	return "redirect:itemEdit/"+items.getId();
		
		     //请求转发:浏览器中url不发生改变,request域中的数据可以带到转发后的方法中
	model.addAttribute("id", items.getId());
		     //spirngMvc中请求转发:返回的字符串以forward:开头的都是请求转发, 
		     //后面forward:itemEdit.action表示相对路径,相对路径就是相对于当前目录,当前为类上面指定的items目录.在当前目录下可以使用相对路径随意跳转到某个方法中
		     //后面forward:/itemEdit.action路径中以斜杠开头的为绝对路径,绝对路径从项目名后面开始算
	return "forward:/items/itemEdit.action";

3:void
不走springmvc组件,需写完整路径名
类似一般servlet,用request.setAttribute request.getRequestDispatche("")r.forward(request,response)

9.1restful风格

url的命名风格,Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释。
资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数
Url格式:http://blog.youkuaiyun.com/beat_the_world/article/details/45621673
资源操作:使用put、delete、post、get,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。Put和Delete几乎不使用。
资源是以json(或其他Representation)为载体的、面向用户的一组数据集,资源对信息的表达倾向于概念模型中的数据:
相对而言,数据(尤其是数据库)是一种更加抽象的、对计算机更高效和友好的数据表现形式,更多的存在于逻辑模型中
REST最大的几个特点为:资源、统一接口、URI和无状态。
在这里插入图片描述

10.1异常处理

自定义异常处理器,全局处理,在springmvc中,一般把dap,servlet,controller通过throws Exception向上抛出,最后交给springmvc的异常处理器

<!-- 配置全局异常处理器 -->
	<bean class="cn.itheima.exception.CustomGlobalExceptionResolver"></bean>
11.1上传图片

企业项目一般用图片服务器存图片,不放硬盘
本例中在tomcat中配置图片虚拟目录,在tomcat server中 点击modules------->add web module
document base E:\image path /pic
那么就可以对外访问localhost:/8080/pic/m.jpg
或者可以修改tomcat:在conf/server.xml文件,添加虚拟 目录 :

导入上传图片的两个包
<form id="itemForm" action="${pageContext.request.contextPath }/items/updateitem" method="post" enctype="multipart/form-data">
	<tr>
				<td>商品图片</td>
				<td>
					<c:if test="${item.pic !=null}">
						<img src="/pic/${item.pic}" width=100 height=100/>
						<br/>
					</c:if>
					<input type="file"  name="pictureFile"/> 
				</td>
			</tr>
				<tr>
				<td colspan="2" align="center"><input type="submit" value="提交" />
				</td>
			</tr>
	<!-- 文件上传 -->
	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<!-- 设置上传文件的最大尺寸为5MB -->
		<property name="maxUploadSize">
			<value>5242880</value>
		</property>
	</bean>
	//商品修改提交
	@RequestMapping("/editItemSubmit")
	public String editItemSubmit(Items items, MultipartFile pictureFile)throws Exception{
		
		//原始文件名称
		String pictureFile_name =  pictureFile.getOriginalFilename();
		//新文件名称
		String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));
		
		//上传图片
		File uploadPic = new java.io.File("F:/develop/upload/temp/"+newFileName);
		
		if(!uploadPic.exists()){
			uploadPic.mkdirs();
		}
		//向磁盘写文件
		pictureFile.transferTo(uploadPic);

.....

12.1拦截器

springmvzc中拦截器类似servlet中的filter

	<!-- 配置拦截器 -->
	<mvc:interceptors>
		<!-- 多个拦截器的执行顺序等于springMvc.xml中的配置顺序 -->
<!-- 	<mvc:interceptor> -->
			<!-- 拦截请求的路径    要拦截所有必需配置成/** -->
<!-- 			<mvc:mapping path="/**"/> -->
			<!-- 指定拦截器的位置 -->
<!-- 			<bean class="cn.itheima.interceptor.Interceptor1"></bean> -->
<!-- 	</mvc:interceptor> -->
		
<!-- 	<mvc:interceptor> -->
			<!-- 拦截请求的路径    要拦截所有必需配置成/** -->
<!-- 			<mvc:mapping path="/**"/> -->
			<!-- 指定拦截器的位置 -->
<!-- 			<bean class="cn.itheima.interceptor.Interceptor2"></bean> -->
<!-- 	</mvc:interceptor> -->
		
		<mvc:interceptor>
			<!-- 拦截请求的路径    要拦截所有必需配置成/** -->
			<mvc:mapping path="/**"/>
			<!-- 指定拦截器的位置 -->
			<bean class="cn.itheima.interceptor.LoginInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>
用户身份认证
Public class LoginInterceptor implements HandlerInterceptor{

	@Override
	Public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {

		//如果是登录页面则放行
		if(request.getRequestURI().indexOf("login.action")>=0){
			return true;
		}
		HttpSession session = request.getSession();
		//如果用户已登录也放行
		if(session.getAttribute("user")!=null){
			return true;
		}
		//用户没有登录跳转到登录页面
		request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
		return false;
	}
}

用户登陆controller
//登陆页面
	@RequestMapping("/login")
	public String login(Model model)throws Exception{
		
		return "login";
	}
	//登陆提交
	//userid:用户账号,pwd:密码
	@RequestMapping("/loginsubmit")
	public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{
		//向session记录用户身份信息
		session.setAttribute("activeUser", userid);
		return "redirect:item/queryItem.action";
	}
	//退出
	@RequestMapping("/logout")
	public String logout(HttpSession session)throws Exception{
		//session过期
		session.invalidate();
		return "redirect:item/queryItem.action";
	}
发送请求,先进行拦截,判断,跳转,再拦截,再执行
13.1springmvc和strtus2区别

springmvc速度快于strtus2
springmvc基于方法,单例开发,strtus2基于类,只能多例开发
springmvc将url和controller的方法进行映射,生成一个handler对象,只包括此方法,完毕即销毁。

14.1解决get和pos乱码

post

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>

get

第一种:修改tomcat配置文件,让工程编码和tomcat一致。
第二种,代码参数修改:
String name=new  String(request.getParamter("name").getBytes("iso8859-1"),"utf-8");
Unity调用手机摄像头避坑指南:从权限检测到自动对焦问题解决 本文深入解析了Unity移动端集成手机摄像头时遇到的权限、对焦与性能等核心难题。针对权限管理,提供了健壮的原生接口调用方案;针对自动对焦模糊问题,详细对比了原生插件与第三方插件两种解决路径;并分享了分辨率选择、数据处理及功耗控制等关键性能优化技巧,帮助开发者构建稳定高效的摄像头功能。 阅读详情

相关推荐

MobaXterm远程连接频繁掉线?3个SSH保活设置让你告别断连烦恼

本文针对MobaXterm远程连接频繁掉线问题,提供了3个SSH保活设置方案。从基础的SSH心跳机制到进阶的会话超时调整,再到TCP层保活与代理优化,全方位解决断连烦恼。特别适合需要稳定远程连接的开发者和运维人员,有效提升工作效率。

weixin_29250573的博客 486

AI的神奇魔法让您的证件照更专业

这样,你的证件照不仅能够满足标准要求,还能展现出你的个性和品味。”是一款免费的标准证件照生成器,利用先进的AI技术,可以将自行拍摄的照片轻松转化为各类证件照的大小尺寸。只要打开“证照猴证件照”,按照提示操作,即可快速制作出专业形象的证件照。无论你需要哪种尺寸、哪种背景色的证件照,都能在“证照猴证件照”中找到解决方案。将拍摄的照片导入到“证照猴证件照”中,选择所需的尺寸和背景色,即可轻松生成一张标准的证件照。选择一个合适的背景,最好是纯色背景,这样能够突出人物,使照片更加专业。”的小程序为你解决了这个问题。

yichafen999的博客 1757

基于Simulink的魔术公式轮胎动力学仿真

本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。

shy_201992的博客 6940

Datawhale4月组队学习llm第三章:搭建知识库

向量数据库是用于高效计算和管理大量向量数据的解决方案。向量数据库是一种专门用于存储和检索向量数据(embedding)的数据库系统。它与传统的基于关系模型的数据库不同,它主要关注的是向量数据的特性和相似性。在向量数据库中,数据被表示为向量形式,每个向量代表一个数据项。这些向量可以是数字、文本、图像或其他类型的数据。向量数据库使用高效的索引和查询算法来加速向量数据的存储和检索过程。

2301_80058383的博客 1739

RV1126平台librga图像旋转裁剪实战

本文详细介绍了在rv1126平台上使用librga库实现图像旋转和裁剪的方法。首先解释了librga的基本概念和关键对象,包括源图像、目标图像和操作参数。随后分步骤说明了初始化设置、缓冲区创建、裁剪区域定义(通过坐标和尺寸参数)以及旋转操作(支持常见角度)。提供了完整的示例代码演示如何组合裁剪和旋转操作,并强调了性能优化、错误处理、格式支持等注意事项。通过硬件加速的librga,可以在rv1126平台上高效完成图像处理任务。

hwmxrhx的博客 1543

别再手动调参了!用Optuna+PyTorch搞定Transformer时序预测超参数(附完整代码)

本文详细介绍了如何利用Optuna和PyTorch实现Transformer时序预测模型的自动化超参数调优。通过贝叶斯优化技术,显著提升单变量时序预测的效率和准确性,并附有完整代码实现。文章涵盖模型架构设计、数据预处理、Optuna调参实战及生产环境部署建议,为开发者提供一站式解决方案。

weixin_33704234的博客 576

Spring MVC详解(转)

1.1介绍Spring MVC是Spring Framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能Java Web开发者必须要掌握的技术框架1.2MVC是什么MVC是一种软件架构思想,把软件按照模型,视图,控制器来划分Model:模型层,指工程中的JavaBean,用来处理数据JavaBean分成两类:一类称为实体类Bean:专门用来存储业务数据,比如Student,User。

朱塔山的博客 1万+

肺癌术后随访离散选择实验(DCE)设计与SAS实现

随着肺癌早期诊断和治疗技术的进步,肺癌患者的生存率显著提高,术后随访管理成为提升患者生活质量的关键环节。然而,如何在有限的医疗资源下设计出既符合患者需求又具有成本效益的随访方案,是临床决策面临的重要挑战。 离散选择实验(Discrete Choice Experiment, DCE)是一种定量研究方法,通过模拟真实世界的选择情境,测量患者对不同随访方案属性的偏好程度。本研究旨在通过DCE方法,系统评估肺癌术后患者对随访服务的偏好,为制定以患者为中心的随访策略提供循证依据。

huanghm88的专栏 99

【框架篇】Spring MVC 介绍及使用(详细教程)

Spring MVC是Spring框架提供的基于MVC架构并继承了Servlet API的Web开发框架。它遵循MVC模式的原则,提供了一套完整的开发流程和特性。通过Spring框架的支持,它能够实现灵活性、可配置性和可扩展性,帮助开发者构建高性能的Web应用程序。

小杨的博客 6万+

7、复杂分布式水文模型的两阶段代理参数校准框架

本文提出了一种针对复杂分布式水文模型的两阶段代理参数校准框架,旨在解决可变入渗能力模型(VIC)在参数校准过程中计算成本高、耗时长的问题。该框架结合AdaBoost与反向传播神经网络(BPNN)构建高精度代理模型,并引入ε-NSGA II多目标优化算法加速搜索最优参数集。通过在兰江流域和湘江流域的实验验证,该方法在校准效率上提升了约20倍,同时保持了高模拟精度(NSE接近1,Bias接近0)。框架采用两阶段设计:第一阶段(SM-I)快速筛选关键参数范围,第二阶段(SM-II)进行高精度预测,显著减少了无效计

apple5的专栏 86

【Codecs系列】x265编码器(十二):子像素运动搜索

在基于块运动补偿的视频编码框架中,运动搜索是最为重要的环节之一,同时也是编码端最为耗时的模块。运动搜索包括整像素运动搜索和子像素运动搜索,其中整像素运动搜索已经有很多快速算法,比如经典的三步搜索法、菱形搜索、六边形搜索以及TZSearch等等;但子像素搜索的快速算法却比较少,本文主要讲解x265编码器中的子像素搜索方法以及相关的快速搜索方法。

优快云明星博主,认证博客专家,视频、Matlab领域优质创作者。 748

SpringMVC全套详解

表示应用程序中的数据和业务逻辑。在Spring MVC中,通常使用POJO(Plain Old Java Object)作为模型对象。通常模型对象负责在数据库中存取数据。负责展示用户界面,通常是HTML页面、JSON响应或其他类型的视觉呈现。视图负责将模型数据渲染,并向用户呈现。接收并处理HTTP请求,并根据请求的内容选择相应的处理方法。控制器负责调度适当的业务逻辑,操作模型数据,并通过相应的视图返回响应结果。

Original0的博客 7956

YOLO26优化:AAAI2026 | 融合PartialNet Block的C3k2-YOLO高效目标检测网络 | 轻量化涨点设计

PartialNet Block 结合YOLO26的C3k2模块,进行二次创新。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 592

【SpringMVC篇】——我们为什么学习SpringMVC?

学前思考:我们为什么要学习springMVC?他帮助我们解决了什么技术上的问题?

m0_64231944的博客 1172

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SpringMVC 学习总结

Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,它也是存在于 Spring 框架之中的,通俗的说,它其实就是 Spring 框架中的 Web 模块。 所以说,之前 Servlet 拥有的 " request 和 response ",我们依然能够在此框架中使用。

书生-w的博客 7171

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SpringMVC学习之路

SpringMVC学习之路一、SpringMVC简介1.1 什么是MVC二、HolleWord2.1 创建Maven工程,引入依赖2.2 配置web.xml2.3 创建请求控制器 一、SpringMVC简介 1.1 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器划分 M:指的是Model层(模型层),指的是工程里的JavaBean。 JavaBean分两类: 实体类Bean:存储业务数据 业务处理Bean:Service或者Dao对象 V: 视图层, 指的是前端显示界面,与用户交

Seven597的博客 660

关于SpringMVC的学习

Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC”来自其源模块的名称( spring-webmvc ),但它通常被称为“Spring MVC”。Spring 家族原生产品,与IOC容器等基础设施无缝对接表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案代码清新简洁,大幅度提升开发效率内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可。

qq_74384876的博客 1071

SpringMVC学习笔记

本文是一篇SpringMVC学习笔记,主要记录了Java Web项目创建、Tomcat配置、SpringMVC核心功能及常见问题的解决方案。内容包括:1)5种Java项目创建方式;2)Tomcat项目配置流程;3)SpringMVC核心注解使用(如@RequestMapping、@RequestParam等);4)异常处理与自定义异常实现;5)拦截器配置与使用;6)常见问题排查(如文件上传报错等)。笔记重点记录了参数绑定、RESTful风格处理、JSP与HTML区别等实际开发中的关键知识点,并提供了代码示例

weixin_47257473的博客 1029

springmvc学习篇——文件下载

springmvc学习篇——文件下载 1.前端jsp页面写个超链接跳进去 <a href="${pageContext.request.contextPath}/springmvc/fileDowload">点击下载</a> 2.文件下载的返回类型要用 ResponseEntity @Controller //该注解表将当前类交给spring容器管理 @S...

qq_38314062的博客 178

记SpringMvc学习的要点

ss

qq_40903237的博客 288

SpringMVC学习总结

springmvc的控制器由一个pojo(普通的java类)担任,因此需要@controller注解将其标识为控制层组件,交给spring的ioc容器管理,此时springmvc才能识别控制器的存在。@requestmapping注解的method属性是一个requestmethod类型的数组,表示该请求映射能够匹配多种请求方式的请求,只要满足一个method请求方法就可以。M:model,指工程中的javabean(不是实体类),指的是所有存储数据的类,作用是处理数据。底层用的都是文件复制的过程原理。

m0_74755284的博客 830

SpringMVC的学习路线整理

SpringMVC学习路线整理 快速构建SpringMVC项目 MVC执行流程 MVC三大组件 @RequestMapping注解 SpringMVC基本类型的封装

山不见我,我自见山 672

SpringMvc学习1之springMvc介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、SpringMvc是什么?二、SpringMvc处理流程三、开发环境四、搭建springmvc工程1.创建一个javaweb工程2.引入SpringMvc的jar包3.再resource文件夹下面创建SpringMvc.xml文件总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文

qq_43332008的博客 399

SpringMVC学习指南(1)

文章目录前言一、概述1.1. SpringMVC简介:1.2. MVC模式1.3. Dao封装1.4. 实体类二、HelloWorld2.1. 创建工程2.1.1 创建父项目2.1.2 创建Model2.1.3 添加Tomcat2.2 Helloworld2.2.1 导入依赖2.2.2 写配置web的配置框架自身的配置2.2.3 测试2.3 程序分析三、拓展四、总结 前言 阅读提示:     本博客会手把手教你创建一个SpringMVC的HelloWorld,没有过多

专注技术 4473

学习springmvc的第四天(准备springmvc环境)

准备工作做好就可以愉快的进行springmvc学习了;

xx2wd的博客 324
上一篇: mybatis学习
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值