SpringMVC

第一天

Spring的注解编程

注解与xml形式的作用是一样的

xml中做的配置
对象管理
是否单例 scope=“singleton | prototype”
机制 什么时候加载 scope lazy-init
自动注入 autowire=“byName”
当前对象创建时执行的方法 method-init=“test1”
当前对象销毁时执行的方法 method-destroy=“test2”

注解中做的配置
1.用于替代原有的bean标签 对象创建
@Component
MVC分层架构更加清晰
控制层@Controller
业务层@Service
持久层@Repository
2.用于替代原有bean标签中的属性 对象机制的管理
@Scope(“singleton | prototype”)
@Lazy(true | false)
@PostConstructor 当前对象创建时执行的方法
@ProDestroy 当前对象销毁时执行的方法
3.用于对象创建后的自动注入
@Autowired byName方式 byType方式
@Qualifier 搭配着上面的注解做一个对象的微调整
@Value 支持SpEL
@Resource (使用时必须在括号中指定名字)不是Spring家族的注解
4.以上注解都是写在自己定义的类中
有些时候类不是我们写的 JdbcTemplate DataSource
还想要通过注解的方式去管控这些对象

	4.1.自己定义类
	  类中定义方法,作用是为了创建那些需要管控的对象
	  方法通常有返回值,就是那些类的对象
	  方法上面添加@Bean
	4.2.需要在自己写的类上面添加注解---->核心xml文件一样 让spring知道 读取我
	 @Configuration
	4.3.改变了原有读取xml文件的过程 创建工厂的方式也要相应进行改变
	 BeanFactory factory = new AnnotationConfigApplicationContext(xxx.class);
	4.4.如果我们想要添加一些外部文件的信息
	  可以采用@PropertySource引入外部文件中的内容
	  内容可以利用SpEL来读取
	4.5.自定义的类中可能会有很多的方法
	  其实可以将自定义类拆分  好多个小配置类
	  通过@Import(xxx.class)引入小配置类

=======================================================================================================

对象的管控
SpringIOC  SpringDI  SpringAOP
用于与数据库交互
SpringJDBC
用于做任务处理
SpringTimer


用于做请求与响应的处理
SpringMVC

回顾一下之前的请求与响应

1.导包    别人写好的类
2.主配置  web.xml	DispatcherServlet   *.do
3.小配置  请求--真实类(方法)  对应关系
4.浏览器发请求	找到真实类
5.请求参数	真实类方法中写参数变量就行了----参数的IOC和DI
		普通类型 String int map类型 domain类型
6.响应信息	返回值void String ModelAndView

第二天

使用流程
1.导入jar包(8个jar包)
SpringMVC应该是Spring框架的一个部分,类似于SpringJDBC
包名字 web mvc
SpringMVC充当了控制层的管理
SpringMVC中间也会存在一个自己的配置 建议用注解
请求 响应 Controller层次
Controller层次的类对象通常会交给Spring来管理 @Controller
SpringMVC使用依赖于Spring(核心的包 beans core)
2.核心配置web.xml 核心入口执行类DispatcherServlet

		<servlet>
		  	<servlet-name>mvc</servlet-name>
		  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		</servlet>
		<servlet-mapping>
		  	<servlet-name>mvc</servlet-name>
		  	<url-pattern>*.do</url-pattern>
		</servlet-mapping>

 自己写一个Controller类
 实现
 org.springframework.web.servlet.mvc.Controller接口
 重写方法
 	@Override
	 public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
		return null;
	 } 	
3.小配置(请求名字----真实资源对应关系)	properties   annotation

配置ApplicationContext.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"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!--配置一个请求和真实资源(Controller-Bean)的关系 -->
	<!--将Controller这个类的对象交给Spring容器管理 -->
	<bean id="atmController" class="controller.AtmController" />

	<!-- 请求和这个类对象之间的映射关系 通过请求找到他 -->
	<!-- DispatcherServlet类有一个自己的小弟 负责处理映射关系 SimpleUrlHandlerMapping -->
	<bean id="simpleUrlHandlerMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<!-- 真实的请求和类对应关系 -->
				<prop key="atmController.do">atmController</prop>
			</props>
		</property>
	</bean>
	
</beans>

发送请求localhost:8080/SpringMVC01/atmController.do
提示异常Servlet.init() for servlet [mvc] threw exception
java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/mvc-servlet.xml]

	之前是配置在src根目录下ApplicationContext.xml
	发现这里是一个web项目
	SpringMVC默认去web-inf文件夹下找配置文件
	SpringMVC默认的配置文件名    <servlet-name>标签里面的名字 - servlet.xml

所以有两种解决方式

方式一,将 ApplicationContext.xml 文件放置在规定的位置,且名字为 标签里面的名字 - servlet.xml

方式二, 如果想要修改默认的配置路径
可以在web.xml中 servlet标签内添加init-param

	<servlet>
		<servlet-name>mvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:ApplicationContext.xml</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>mvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
4.浏览器可以发送请求

========================================================================================================================

以上的流程虽然可以实现
但是相比较而言跟最早的Tomcat一样
Controller类有很多规则  耦合度太高了
基于xml形式的配置相较于注解稍微麻烦了一些
将上述的流程改成注解的方式  controller的规则去掉

Tomcat核心web.xml没动的
小配置(Spring的核心配置)
	所有的xml形式去掉了
	扫描所有带注解的包
	<context:component-scan base-package="controller"/>
	开启请求响应注解的处理(加载HandlerMapping类)
	<mvc:annotation-driven/>

具体如下

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">


	<!--将刚才的bean标签配置去掉 改为开启注解扫描 -->
	<context:component-scan base-package="controller"/>
	<!-- 上述一堆删掉 添加一个新的配置 开启注解驱动 相当于是加载了HandlerMapping类对象 -->
	<mvc:annotation-driven/> 
	
</beans>		
原有的Controller类就不用了那么多规则啦
	类上面添加@Controller注解
	类上面添加@RequestMapping("test.do")注解------请求名字对应
	类中的方法上添加@RequestMapping注解----请求执行的方法.

第三天

发送请求----DispatcherServlet

一个请求对应一个Servlet类(继承关系 重写方法)
如何让Servlet类减少
DAO  Service层都是跟表格domain个数对应
想要变成一个请求对应一个Servlet类中的一个方法
发送请求的时候Servlet类中只有一个方法被认识(service doPost/doGet)
将Servlet类中的service方法改变了一种方式
原来service方法是做具体的控制 1.取值 2.调用业务 3.响应
将service方法升级成一个"小总管"  1.接收请求 2.分析(哪个方法) 3.分发
后来又发现每一个Servlet类中都有一个"小总管"
"小总管提取出来了" DispatcherServlet  
	1.接收请求 
	2.分析(哪个类 哪个方法) 
	3.分发让方法执行
	4.过程中还做了请求参数处理  响应信息的处理   IOC+DI

========================================================================================


0.@RequestMapping注解放置在什么位置
	@Target({ElementType.TYPE, ElementType.METHOD})
	可以放置在类上面(通常这个类应该是Controller)
	可以放置在方法上面(Controller类中某个具体方法)
1.如何发送请求
	#方式一: 发送时候直接写  类名.do
		 在类上面写注解@RequestMapping(path | value = "类名.do")
		 在类中只有一个方法 方法上面添加注解@RequestMapping
@Controller
@RequestMapping(value="a.do" )
public class AtmController{
	@RequestMapping
	public void test() {
		System.out.println("test执行了");
	}
	
} 		
	#方式二:发送请求时候    类名字.do?method=方法名
		 类上面写注解(类名.do)
		 方法上面写注解(params={""})
		 (请求结构就比较麻烦  类名.do?method=方法名)
		 (类的注解也很麻烦 类上一个 方法上一个 方法的这个注解还有params参数)
@Controller
@RequestMapping(value="a.do" )
public class AtmController{
	@RequestMapping( params = {"name=admin","pass="})
	public void test() {
		System.out.println("test执行了");
	}
	@RequestMapping()
	public void test1() {
		System.out.println("test1执行了");
	}
} 			
	方式三: 发送请求的时候   xxx.do  (xxx通常是一个方法名)
		 类上面就不用写注解啦
		 类中方法的上面写注解  注解中写与请求对应的那个  xxx.do
@Controller
@RequestMapping
public class AtmController{
	@RequestMapping(value="a.do" )
	public void testa() {
		System.out.println("a执行了");
	}
	@RequestMapping(value="b.do" )
	public void testb() {
		System.out.println("b执行了");
	}
	
}		
2.@RequestMapping注解中的"方法"
String name() default "";
		//路径
	    @AliasFor("path")
	    String[] value() default {};
		//路径
	    @AliasFor("value")
	    String[] path() default {};
		//RequestMethod.GET,RequestMethod.POST,...
	    RequestMethod[] method() default {};
		//参数
	    String[] params() default {};
		//请求头
	    String[] headers() default {};
		
	   

第四天

研究一下SpringMVC提供的接收参数方式
1.方法中直接传入变量
变量直接接收 要求变量名字与前面传递的key一致
即便是一个变量也需要对应key一致 否则接收不到
如果变量和前面传递的key不一致,可以利用注解@RequestParam(“key”)放在参数的前面
参数的类型可以不一定是String ,int可以

@Controller
@RequestMapping
public class AtmController{
	//localhost:8080/SpringMVC01/test1.do?name=zhangsan&pass=asd123fgh
	@RequestMapping(value="test1.do" )
	public void test1(String name,String pass) {
		System.out.println("test1"+name);
		System.out.println(pass);
	}
	//localhost:8080/SpringMVC01/test2.do?param1=zhangsan&param2=asd123fgh
	@RequestMapping(value="test2.do" )
	public void test2(@RequestParam("param1") String name, @RequestParam("param2") String pass) {
		System.out.println("test2"+name);
		System.out.println(pass);
	}
	
} 		
2.方法中直接传入实体对象
	如果传递的参数可以组合成一个对象 
	可以用对象直接接收
	对象中的属性名和前面传递的key一致
	如果对象里面还有对象属性(套娃)
	只需要在请求的时候写 对象的属性.属性名即可
	比如User中有一个Wallet对象  Wallet中有个money属性
		wallet.money
@Controller
@RequestMapping
public class AtmController{
	
	//localhost:8080/SpringMVC01/test3.do?name=zhangsan&pass=asd123fgh
	@RequestMapping(value="test3.do" )
	public void test3(Atm atm) {
		System.out.println("test3"+atm);
	}
	
} 

当Person对象里有一个Atm属性时

@Controller
@RequestMapping
public class AtmController{
	
	//localhost:8080/SpringMVC01/test4.do?name=zhangsan&age=123&atm.name=zhangsan&atm.pass=asd123fgh
	@RequestMapping(value="test4.do" )
	public void test4(Person person) {
		System.out.println("test4"+person);
	}
	
}

list/set一致
当Person对象里有一个List属性时

	<form action="test5.do" method="post">
  		<input type="text" name="name">
  		<input type="text" name="age">
  		<input type="text" name="atms[0].name">
  		<input type="text" name="atms[0].pass">
  		<input type="text" name="atms[1].name">
  		<input type="text" name="atms[1].pass">
  		<input type="submit" value="go">
  	</form>
@Controller
@RequestMapping
public class AtmController{
	
	@RequestMapping(value="test5.do" )
	public void test5(Person person) {
		System.out.println("test5"+person);
	}
	
} 	

当Person对象里有一个Map属性时

	<form action="test6.do" method="post">
  		<input type="text" name="name">
  		<input type="text" name="age">
  		<input type="text" name="atms['param1'].name">
  		<input type="text" name="atms['param1'].pass">
  		<input type="text" name="atms['param2'].name">
  		<input type="text" name="atms['param3'].pass">
  		<input type="submit" value="go">
  	</form>	
@Controller
@RequestMapping
public class AtmController{
	
	@RequestMapping(value="test6.do" )
	public void test6(Person person) {
		System.out.println("test6"+person);
	}
	
}  		
3.方法中传入Map集合的方式
	可以使用Map类型来接收请求的参数的
	前提是  Map参数的前面  必须添加@RequestParam
	否则Map是无法接收到参数的
	
4.方法中传递原生Request对象
	直接在方法中传递参数变量即可接收
	HttpServletRequest
	HttpServletResponse

第五天

接收请求参数的时候产生的中文乱码问题
可以利用SpringMVC给我们提供的一个小过滤器处理

web.xml中设置

	<filter>
		<filter-name>encoding</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>
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

如何自定义类型转换器
Converter
1.自定义一个类
2.实现上面这个接口
接口是支持泛型 Converter<String,Type>
3.重写接口中的转换方法
方法内部该做具体转化的事情
方法会返回一个转化后的对象
4.告知Spring这里有一个自定义的类型转换器
需要让Spring帮我们加载并管理起来
配置
在ApplicationContext.xml中配置

<!-- 加载自定义的类型转换器 -->
	<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
		<property name="converters">
			<!-- 自己写的转换类 -->
			<bean class="util.StringToConverters"/>
		</property>
	</bean>
	<!-- 手动配置这个类的驱动 -->
	<mvc:annotation-driven conversion-service="conversionService"/>
-----------------------------------------------------------

接收请求参数的时候
@RequestParam注解   写在变量前面 或者  Map前面

@RequestHeader注解  接收协议头数据
	放在方法参数里	@RequestHeader("Accept-Language")String header

@CookieValue
	放在方法参数里	@CookieValue("JSESSIONID")String cookieValue

@RequestBody注解(JSON)	接收 key=value;key=value 放在参数前面
	放在方法参数里	@RequestBody String body
	注解只能接收post请求方式  post请求是存在协议体(参数)
	get请求只有协议头没有协议体

@ResponseBody注解(JSON) 响应

@ModelAttribute注解
	放在某一个方法上面@ModelAttribute("test.do")
	方法在请求的方法执行之前先执行的(块 init)

第六天

浏览器发送一个请求
请求xxx.do
通过核心的"小总管"DispatcherServlet分发
具体的类中的某个具体的方法
通过方法中的参数列表接收请求的信息
方法中调用业务层执行具体逻辑-----service.login(name,pass);----dao----DB
根据结果进行响应信息的处理	控制层---控制响应信息View
	
	处理响应信息的方式
	1.采用原生response对象,获取输出流的方式进行直接响应
		方法返回值void就可以了
		方法的参数HttpServletResponse response
		方法的内部获取PrintWriter输出流对象  response.getWriter();
		writer.write("<>");
		如果响应信息中含有中文
		需要在方法的最上面设置中文字符集的解析方式
		response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
	2.转发	request.getRequestDispatcher().forward(request,response);
	3.重定向response.sendRedirect();
	以上这种方式并不好,不建议大家使用


	利用"小总管"来帮我们处理转发和重定向的事情
	方法的返回值利用String类型
	方法内部return需要转发/重定向的资源位置
	重定向需要在资源名字之前添加  redirect:xxx.jsp
	转发也可以填写关键字   forward:xxx.jsp   默认不写就当做转发啦

第七天

继续研究一下如何处理响应信息
	void  String以外
	现在开发项目通常都是前后端分离形式
		JSP(编译过程 性能不好)  静态数据+动态数据  一次请求 一次拼接 一次响应
		静态数据先响应  动态数据发送异步请求 而后在浏览器端进行拼接展示
		HTML+AJAX+JSON(JS操作)

		String  转发路径   AJAX请求直接响应
		Map  domain--->AJAX响应--JSON

总结
响应信息方式如下
	void表示不需要框架帮我们处理响应信息
		只能自己通过原生response获取输出流 回写响应信息
	String(没有@ResponseBody注解)
		表示请求框架帮我们处理响应信息路径的转发或重定向
		forward:
		redirect:
	通常发送异步请求  map domain list set
		表示需要框架帮我们处理响应信息  将这些对象转化成JSON形式响应回去
		1.导包jackson(core databind annotations)
		2.方法上面添加@Responsebody注解告知框架帮我们解析
		注解@ResponseBody,可以放在方法的上面或者返回值的前面	

具体如下

<html>
  <head>
  <script type="text/javascript">
  	window.onload = function(){
  		document.getElementById("i1").onclick = function(){
  			var xhr = new XMLHttpRequest();
  			/* 可以在这里传递参数给Controller */
  			xhr.open("POST","ajax.do?name=zhangsan",true);
  			xhr.onreadystatechange = function(){
  				if(xhr.readyState==4 && xhr.status==200){
  					alert(xhr.responseText);
  				}
  			}
  			xhr.send();
  		}
  	}
  </script>
    <title>$Title$</title>
  </head>
  <body>
   	<input type="button" value="go" id="i1">
  </body>
</html>
@ResponseBody
	@RequestMapping("ajax.do")
	public Atm test1(String name) {
		System.out.println(111);
		System.out.println(name);
		//将对象转为JSON返回
		//导入json相关的jar包(三个)
		//添加注解@ResponseBody,可以放在方法的上面或者返回值的前面	
		return new Atm("张三","123",99F);
	}			
	发送请求如果是JSON形式该如何处理
		发送端设置JSON形式
		接收端(服务端的方法) 参数上面@RequestBody即可 domain对象接收
<html>
  <head>
  <script type="text/javascript">
  	window.onload = function(){
  		document.getElementById("i1").onclick = function(){
  			var xhr = new XMLHttpRequest();
  			/* 可以在这里传递参数给Controller */
  			xhr.open("POST","ajax.do",true);
//如果发送json数据,需要告知浏览器解析规则,如果不是发送json数据,下面这一行不用写
  			xhr.setRequestHeader("Content-type","application/json;charset=UTF-8")
  			xhr.onreadystatechange = function(){
  				if(xhr.readyState==4 && xhr.status==200){
  					alert(xhr.responseText);
  				}
  			}
/* 也可以在这里发送数据给Controller*/
  			xhr.send('{"pass":"asd123","name":"zhangsan"}');
  		}
  	}
  </script>
    <title>$Title$</title>
  </head>
  <body>
   	<input type="button" value="go" id="i1">
  </body>
</html>

接收端的方法参数前面添加@RequestBody()注解

@Controller
@RequestMapping
public class AtmController{
	@ResponseBody
	@RequestMapping("ajax.do")
	public Atm test1(@RequestBody() Atm atm) {
		System.out.println(111);
		System.out.println(atm);
		//将对象转为JSON返回
		//导入json相关的jar包(三个)
		//添加注解@ResponseBody,可以放在方法的上面或者返回值的前面	
		return new Atm("张三","123",99F);
	}
	
} 

第八天

利用控制层的方法返回值来处理响应
1.void	  不用框架帮我们处理  需要自己处理  response.getWriter() write()
2.String  让框架帮我们去做转发、重定向   String----资源名字
		forward:     redirect:
3.Object  domain String Map List----->JSON
		1.处理工具---jar
		2.告知框架方法的返回值需要解释  @Responsebody
4.ModelAndView
		存储信息
		转发的路径

服务端业务层可能会产生一些数据
这些数据我们需要存入作用域中带走
	request.setAttribute();

1.可以利用原生Map来处理
	Map接收请求参数(@RequestParam)
	Map可以返回数据(@ResponseBody)
2.可以利用Model 或 ModelMap
	Model底层继承ModelMap
	存储数据之前不需要自己创建
	只需将变量放置在方法的参数里即可  框架会帮我们自动注入
	m.addAttribute("",object);
	但是只能存储数据
	不能携带转发的路径资源
	对象不需要返回
3.可以利用ModelAndView
	不能放在方法的参数里 框架不会帮我们注入
	需要用的时候 自己new即可
	mv.addObject("key",object);
	mv.setViewName("xxx.jsp");
	可以包含数据和转发路径
	需要将自己创建的mv对象返回
4.如果想要将值存入session作用域范畴内
	需要在类名上面添加注解
	@SessionAttributes({"key1","key2","key3"})
	当m.addAttribute("",object);或者mv.addObject("key",object);时,
	如果key的值和SessionAttributes注解里得值相同,会先存入request内,再存入session内

第九天 异常的处理
1.自己定义一个异常类MyException将所有的异常都统一捕获 变成一个唯一的异常 交给总管

public class MyException {

	private String mess;

	public MyException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public MyException(String mess) {
		super();
		this.mess = mess;
	}
	
	
	
}

将可能产生异常的代码用try包起来,并且在catch里抛出异常throw new MyException(“异常了”);

2.自己定义一个异常处理类ExceptionResolver(核心)(处理异常 做转发 响应) 实现规则
	实现接口HandlerExceptionResolver
	重写方法public ModelAndView resolveException(request,response,object,exception){
			判断一下exception对象是否是我们自己抛出
			创建ModelAndView对象  存储信息  转发路径  error.jsp
			return mv;
		}

具体如下

public class ExceptionResolver implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
			Exception e) {
		ModelAndView mv= new ModelAndView();
		//验证捕获的异常是不是抛出的
		if(e instanceof MyException) {
			//到这里说明代码产生异常了
			mv.setViewName("error.jsp");
			mv.addObject("rtv",e.getMessage());
		}
		return mv;
	}

}			
3.告知Spring将我们自己定义的处理类管理起来(配置文件  xml 注解)
	自己定义的处理类上面添加@Component注解(别忘了扫描包)

第十天
SpringMVC的拦截器(Interceptor)
原生Tomcat时候
Servlet----资源类
1.请求 2.找业务 3.响应处理(拼接响应信息String<><>)
JSP(Java Server Page)----本质就是Servlet
帮助Servlet服务的 响应拼接 静态资源+动态数据
静态动态分离 HTML+AJAX+JSON
Filter-----过滤器 特殊的Servlet
责任链设计模式
动态代理机制----AOP设计思想

SpringMVC的拦截器可以理解为是以前的Filter
在真正到达资源(Controller---Servlet)之前做事情的
SpringAOP----自己定义类和方法---交给Spring帮我们管理

拦截器使用流程
1.自己定义一个拦截器的类(规则)
	继承HandlerInterceptorAdapter
或者	实现HandlerInterceptor(接口中三个方法都是default修饰)
2.自定义类的方法需要重写
	preHandle	预先处理(controller之前执行)	SpringAOP前置
		返回true表示放行,返回false表示不放行,如果不放行可以用req转发或重定向
	postHandle	请求后处理(controller之后执行)	SpringAOP后置
	afterCompletion	完成后处理(controller执行完毕后)
3.配置ApplicationContext.xml文件配置(告知Spring框架有一个拦截器 帮我们进行管理)
	过滤器Filter		拦截器Interceptor
	Tomcat容器提供的		SpringMVC框架提供
	没有框架的时候可以	必须有框架支持
	配置web.xml		Spring核心文件ApplicationContext.xml  "小总管"  /*  *.do
	处理所有请求		处理Servlet请求
		<mvc:interceptors>
			<mvc:interceptor>
				<mvc:mapping path="/*">
				<bean class="自定义类1">
			</mvc:interceptor>
			<mvc:interceptor>
				<mvc:mapping path="/*">
				<bean class="自定义类2">
			</mvc:interceptor>
		</mvc:interceptors>

第十一天
文件上传/下载
依赖于Apache提供的两个jar
commons-io
commons-fileupload

	基于SpringMVC的方式
	1.配置一个文件解析器	CommonsMultipartResolver
	2.自己写一个Controller
		方法内部像之前一样接收参数即可
		文件参数MultipartFile类型 变量名与前面的key一致
	3.用MultipartFile对象做文件的传输
		transferTo(new File("上传路径"))

第十二天
知识回顾
文件上传问题
1.导包 fileupload commons-io
2.DiskFileItemFactory ServletFileUpload parseRequest
3.List
4.判断是否为表单 item.isFormField()
item.getFieldName
item.getString(“UTF-8”)
5.文件对象
item.getName()
item.write(new File(“上传路径”));
基于SpringMVC方式
1.导包
2.配置文件解析器
3.Controller类中做简单操作即可
方法参数可以直接用变量来接收
String text
MultipartFile upload
4.获取文件名字 文件内容 传输
upload.getOriginalFilename();
upload.transferTo(new File(“上传路径”));

原文地址:https://blog.csdn.net/weixin_44760421/article/details/117196137

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


开发过程中是不可避免地会出现各种异常情况的,例如网络连接异常、数据格式异常、空指针异常等等。异常的出现可能导致程序的运行出现问题,甚至直接导致程序崩溃。因此,在开发过程中,合理处理异常、避免异常产生、以及对异常进行有效的调试是非常重要的。 对于异常的处理,一般分为两种方式: 编程式异常处理:是指在代
说明:使用注解方式实现AOP切面。 什么是AOP? 面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。 AOP底层使用动态代理。 AOP术语 连接点
Spring MVC中的拦截器是一种可以在请求处理过程中对请求进行拦截和处理的机制。 拦截器可以用于执行一些公共的操作,例如日志记录、权限验证、数据转换等。在Spring MVC中,可以通过实现HandlerInterceptor接口来创建自定义的拦截器,并通过配置来指定拦截器的应用范围和顺序。 S
在 JavaWeb 中,共享域指的是在 Servlet 中存储数据,以便在同一 Web 应用程序的多个组件中进行共享和访问。常见的共享域有四种:ServletContext、HttpSession、HttpServletRequest、PageContext。 ServletContext 共享域:
文件上传 说明: 使用maven构建web工程。 使用Thymeleaf技术进行服务器页面渲染。 使用ResponseEntity实现下载文件的功能。 @Controller public class FileDownloadAndUpload { @GetMapping(&quot;/file/d
创建初始化类,替换web.xml 在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为SpringS
在 Web 应用的三层架构中,确保在表述层(Presentation Layer)对数据进行检查和校验是非常重要的。正确的数据校验可以确保业务逻辑层(Business Logic Layer)基于有效和合法的数据进行处理,同时将错误的数据隔离在业务逻辑层之外。这有助于提高系统的健壮性、安全性和可维护
什么是事务? 事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功,要么都失败,如果操作之间有一个失败所有操作都失败 。 事务四个特性(ACID) 原子性 一组操作要么都成功,要么都失败。 一致性 一组数据从事务1合法状态转为事务2的另一种合法状态,就是一致。 隔离性 事
什么是JdbcTemplate? Spring 框架对 JDBC 进行封装,使用 JdbcTemplate 方便实现对数据库操作。 准备工作 引入jdbcTemplate的相关依赖: 案例实操 创建jdbc.properties文件,配置数据库信息 jdbc.driver=com.mysql.cj.
SpringMVC1.MVC架构MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范是将业务逻辑、数据、显示分离的方法来写代码MVC主要作用是:降低了视图和业务逻辑之间的双向耦合MVC是一个架构模型,不是一种设计模式。1.model(模型)数据模型,提供要展示的数据,因此包
SpringMVC学习笔记1.SpringMVC应用1.1SpringMVC简介​SpringMVC全名叫SpringWebMVC,是⼀种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品。​MVC全名是ModelViewController,是模型(model)-视图(view)-控制器(co
11.1数据回显基本用法数据回显就是当用户数据提交失败时,自动填充好已经输入的数据。一般来说,如果使用Ajax来做数据提交,基本上是没有数据回显这个需求的,但是如果是通过表单做数据提交,那么数据回显就非常有必要了。11.1.1简单数据类型简单数据类型,实际上框架在这里没有
一、SpringMVC简介1、SpringMVC中重要组件DispatcherServlet:前端控制器,接收所有请求(如果配置/不包含jsp)HandlerMapping:解析请求格式的.判断希望要执行哪个具体的方法.HandlerAdapter:负责调用具体的方法.ViewResovler:视图解析器.解析结果,准备跳转到具体的物
1.它们主要负责的模块Spring主要应用于业务逻辑层。SpringMVC主要应用于表现层。MyBatis主要应用于持久层。2.它们的核心Spring有三大核心,分别是IOC(控制反转),DI(依赖注入)和AOP(面向切面编程)。SpringMVC的核心是DispatcherServlet(前端控制器)。MyBatis的核心是ORM(对
3.注解开发Springmvc1.使用注解开发要注意开启注解支持,2.注解简化了,处理映射器和处理适配器,只用去管视图解析器即可案例代码:1.web.xml,基本不变可以直接拿去用<!--调用DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name>
拦截器概述SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。**过滤器与拦截器的区别:**拦截器是AOP思想的具体应用。过滤器servlet规范中的一部分,任何javaweb工程都可以使用
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:xsi="
学习内容:1、SSH&SSM2、Spring3、Struts2&SpringMVC4、Hibernate&MyBatis学习产出:1.SSH和SSM都是有Spring框架的,他们两个差不多。2.Spring分为四个模块,持久层,表示层,检测层,还有核心层,核心层分为2个关键核心功能。分别为,控制反转(IOC),依赖注入(DI),和面向切面编程
一、SpringMVC项目无法引入js,css的问题具体原因是css和js等被SpringMVC拦截了:解决方案:在spring-mvc.xml中配置<mvc:default-servlet-handler/><?xmlversion="1.0"encoding="UTF-8"?><beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
开发环境:Eclipse/MyEclipse、Tomcat8、Jdk1.8数据库:MySQL前端:JavaScript、jQuery、bootstrap4、particles.js后端:maven、SpringMVC、MyBatis、ajax、mysql读写分离、mybatis分页适用于:课程设计,毕业设计,学习等等系统介绍