responsebody的使用-表示返回的是一个内容而不是一个待跳转的页面
@Controller
@RequestMapping(“/stu”)
public class StudentController{
@RequestMapping(“getAllStu”){
@ResponseBody
public String getAllStu(){
List<Student> studentList = new ArrayList<Student>();
studentList.add(new Student(101));
studentList.add(new Student(102));
studentList.add(new Student(103));
String json = JSON.toJSONString(studentList);
return json;
}
}
springMVC处理静态资源
默认情况下springMVC会把所有的静态资源都给拦截掉
<mvc:resources location=”/static/” mapping=”/static/**”> </mvc:resources>
springMVC的文件上传
首先需要导入fileupload和io包
<form action=”test/upload” enctype=”multipart/form-data” method=”post”>
文件名:<input type=”text” name=”myFileName”></br/>
文件: <input type=”file” name=”myFile”/>
<input type=”submit” value=”上传”/>
</form>
@Controller
@RequestMapping(“/up”)
public class uploadController{
@RequestMapping(“upload”)
public String upload(String myFileName, MultipartFile mFile, HttpSession session ){
//获取文件保存的绝对地址
String file = session.getServletContext().getRealPath(“upload”);
//定义文件名
//使用一个唯一的编码uuid,
String uuid = UUID.randomUUID().toString().replace(“-”, “”);
//判断文件夹是否存在
File file1 = new File(file);
if(!file1.exists()){
file1.mkdir();
}
String originalFileName = mFile.getOriginalFilename();//获取文件的原始名称
//拼接文件的名称
myFilename = uuid + originalFileName ;
try{
mFile.transferTo(new File(file, myFileName));
}catch(Exception e){
e.printStackTrace();
}
session.setAttribute(“msg”, myFileName + “,保存成功!”);
return “main”;
}
}
最终会报错,因为还需要配置视图解析器,需要通过不断的配置来完善
注意;配置的id名称一定要是multipartResolver(这里是一个巨坑,千万不能出错)
细节:保证每次上传图片的文件名称不一致
处理 date类型的数据
如果不做任何的处理,直接返回给前端的话将出现格式错误的问题
只需要加上注解即可
@DateTimeFormat(pattern=”yyyy-MM-dd”);
@JSONField(format=”yyyy-MM-dd”)
private Date date;
拦截器的配置和使用
新建一个com.interceptor包;再建一个MyInterceptor.java
public class MyInterceptor implements HandlerInterceptor{
//共需要实现三个方法
}
return false;//表示不给你放行
需要给拦截器进行配置,声明我有权利拦截谁谁谁,赋权力使能
在springmvc-sevlet.xml中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path=”/**”></mvc:mapping> <!--表示拦截所有的方法-->
<bean class=”com.interceptor.MyInterceptor”></bean>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path=”/**”></mvc:mapping> <!--表示拦截所有的方法-->
<bean class=”com.interceptor.MyInterceptor2”></bean>
</mvc:interceptor>
</mvc:interceptors>
如果配置了多个拦截器,在preHandle方法中顺序和配置的顺序一致,但postHandle和afterCompletion的方法确是相反的,这就是所谓的先进后出。
使用拦截器实现登录验证
@RequestMapping(“/loginController”)
public String loginController(HttpSession session){
//只有登录完了才回把user对象放到session之中
session.setAttribute(“user”, “asdsaad”);
return “main”;
}
LoginedMyInterceptor.java中
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception{
//获取sessio中保存的用户
Object user = request.getSession().getAttribute(“user”);
if(user != null){
return true;
}
//希望跳转回登录页面
else{
request.getRequestDispatcher(“../login.jsp”).forward(request, response);
return false;
}
}
配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path=”/**”></mvc:mapping> <!--表示拦截所有的方法-->
<bean class=”com.interceptor.MyInterceptor”></bean>
</mvc:interceptors>
</mvc:interceptors>
单例模式的三种实现(饿汉模式,懒汉模式,静态内部类)
更详细的可以参考
https://blog.csdn.net/weixin_37841366/article/details/108770432
场景
- BaseDao:操作数据库的基类 init()方法
- 每个线程对系统操作都需要new 一个BaseDao实例
- I/O操作消耗系统资源,影响系统性能
解决方案:对于每个线程,可共享一个实例;单例模式
单例模式;系统运行期间,有且仅有一个实例
一个类只有一个实例-最基本的:只提供私有构造器
它必须自行创建这个实例:定义了静态的该类私有对象
它必须自行向整个系统提供整个实例:提供一个静态的公有方法,返回创建或者获取本身的静态私有对象
单例模式 | 懒汉模式 | 饿汉模式 |
概念 | 在类加载时不创建实例,采用延迟加载的方式,在运行调用时创建实例 | 在类加载的时候,就完成初始化 |
特点 | 类加载速度慢,但是运行时获取对象的速度较快。时间换空间 | 类加载较慢,但获取对象速度快-空间换时间 |
延迟加载(lazy loading) | 具备 | 不具备(静态内部类) |
线程安全 | 线程不安全(同步方式解决) | 线程安全 |
饿汉模式中同时要具备延迟加载的特性-静态内部类