实习日志--6、SSM框架实现批量删除和权限管理功能
ajax技术简介
首先,AJAX是一个缩写,AJAX=Asynchronous JavaScript And XML(异步 JavaScript 及 XML),其次AJAX 并不是一种新的编程语言,而仅仅是一种新的技术,它可以创建更好、更快且交互性更强的 web 应用程序。
AJAX 使用 JavaScript 在 web 浏览器与 web 服务器之间来发送和接收数据。通过在幕后与 web 服务器交换数据,而不是每当用户作出改变时重载整个 web 页面,AJAX 技术可以使网页更迅速地响应。
在这里,简单说一下,传统的 web 应用程序会把数据提交到 web 服务器(使用 HTML 表单),在 web 服务器把数据处理完毕之后,会向用户返回一张完整的新网页。由于每当用户提交输入,服务器就会返回新网页,传统的 web 应用程序往往运行缓慢,且越来越不友好。
优点:
通过 AJAX,web 应用程序无需重载网页,就可以发送并取回数据。完成这项工作,需要通过向服务器发送 HTTP 请求(在幕后),并通过当服务器返回数据时使用 JavaScript 仅仅修改网页的某部分。
批量删除
引入JQuery
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
删除按钮:
<button type="button" class="btn btn-default" title="批量删除" onclick="deleteAll()">
<i class="fa fa-refresh"></i> 批量删除
</button>
controller层:
@RequestMapping("/batchDelete.do")
public String batchDelete(String userList){
String[] strs = userList.split(",");
// string类型强制转换成int类型数组
List<Integer> ids=new ArrayList<>();
for(int i=0;i< strs.length;i++){
ids.add(Integer.parseInt(strs[i]));
}
userInfoService.batchDelete(ids);
return "redirect:findAll.do";
}
编写script代码:
function deleteAll() {
var checkedNum= $("input[name='ids']:checked").length;
if(checkedNum==0){
alert("至少选中一项删除!");
return;
}
if(confirm("确定删除选中的用户?")){
var userList = new Array();
$("input[name='ids']:checked").each(function(){
userList.push($(this).val());
});
}
$.ajax({
type:"post",
url:"${pageContext.request.contextPath}/user/batchDelete.do",
data:{userList:userList.toString()},
success:function () {
alert("删除成功!");
location.reload();
},
error:function () {
alert("删除失败!");
}
});
}
大致效果图类似:
拦截器和过滤器
- 过滤器
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等 - 拦截器
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
区别
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖于servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑
使用
spring-mvc.xml 配置
<mvc:interceptors>
<!-- 拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<mvc:exclude-mapping path="/res/**"/>
<mvc:exclude-mapping path="/login/**"/>
<mvc:exclude-mapping path="/404.html"/>
<bean class="com.cms.intercept.SecurityInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
service层实现方法:
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//1.查询当前登录的用户信息
UserInfo userInfo=userDao.doLogin1(username);
//2.查询当前的用户有多少角色
List<Role> roleList=roleDao.findRoleByUserId(userInfo.getId());
//3.把角色放入用户中
userInfo.setRoleList(roleList);
User user=new User(userInfo.getUsername(),"{noop}"+userInfo.getPassword(),getAuthority(userInfo.getRoleList()));
return user;
}
private Collection<? extends GrantedAuthority> getAuthority(List<Role> roleList) {
List<SimpleGrantedAuthority> list=new ArrayList<>();
for(Role role:roleList){
list.add(new SimpleGrantedAuthority("ROLE_"+role.getRolename()));
}
return list;
}
效果:
抵御一切非法输入,除了登录匹配外无法进入系统。
正常进入admin:具备用户和角色两个管理;
正常进入user:仅一个角色管理;