在用SSM做项目的时候遇到的一些小坑

1.静态资源的配置


如图,静态文件.html放在webapp->WEB-INF->views下
那么利用应该怎么配置呢
一般给出的配置方式是这样的

<mvc:resources location="/" mapping="/**"></mvc:resources>
  <mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
  <mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
  <mvc:resources location="/images/" mapping="/images/**"></mvc:resources>

其中location是静态文件在本地的地址,mapping是需要映射到浏览器url的地址,也就是当我们请求127.0.0.1:8080/js/xxx.js时,服务器会在location指定的本地目录下寻找这个静态文件。
然而当我直接拷过来还是找不到,显然是因为我的本地路径不对。
先看在ecilpse中文件结构目录

WebContent下直接放的静态文件,那么location的其实位置是什么呢,看一下IDEA的 project structure

也就是说/是webapp这个路径
所以正确的配置应该是

<!--config the static file
        location means filepath in project ,mapping means the url mapped
        'webapp' is the start path of location , which is '/'
    -->
    <mvc:resources location="/WEB-INF/views/" mapping="/*.html"/>
    <mvc:resources location="/WEB-INF/views/js/" mapping="/js/**"/>
    <mvc:resources location="/WEB-INF/views/css/" mapping="/css/**"/>
    <mvc:resources location="/WEB-INF/views/images/" mapping="/images/**"/>

2.配置mvc:resources后项目报404的问题

刚开始没有配置mvc:resources,controller能够正确访问,但是由于web.xml使用/拦截了所有的请求,所以静态资源访问不上
增加mvc:resources之后,静态资源是能访问上了,但是注解配置的controller却又找不到了

原因是少了 的配置,在没有配置mvc:resources的时候没有问题,一旦配置了mvc:resources,注解方式的url就没有加载

补上 就可以解决问题

<!--if you use annotation you must configure following setting
        if not, when you config the static file use 'mvc:resource',
        the url define by annotation will not in operation
    -->
    <mvc:annotation-driven/>

参考:https://blog.csdn.net/liujunyu_10/article/details/77860369

3.@ResponseBody注解

@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的呢,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

@RequestMapping("/login")
  @ResponseBody
  public User login(User user){
    return user;
  }

User字段:userName pwd
那么在前台接收到的数据为:’{“userName”:”xxx”,”pwd”:”xxx”}’

效果等同于如下代码:

@RequestMapping("/login")
  public void login(User user, HttpServletResponse response){
    response.getWriter.write(JSONObject.fromObject(user).toString());
  }

4.Ajax请求含有@ResponseBody注解的请求报500


报错代码如下

@RequestMapping(value = "/login", method = RequestMethod.POST)
    public @ResponseBody User user(@RequestParam("username") String username, @RequestParam("password") String password){
        System.out.println("post");
        User user = userService.findByName(username);
        System.out.println(user);
        return user;
    }

少了json的包
加入

<!--json 版本号-->
    <jackson.version>2.8.7</jackson.version>
<!--json-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>

即可正常请求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM(Spring + Spring MVC + MyBatis)项目中,如果你想在项目重启时主动调用 `doGetAuthorizationInfo()` 方法,可以通过在 Shiro 的配置中添加一个监听器来实现。 以下是一种可能的实现方式: 1. 创建一个类,实现 `ServletContextListener` 接口,用于监听项目的启动和关闭事件。例如: ```java import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class ShiroAuthorizationListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { // 在项目启动时调用 doGetAuthorizationInfo() // 你可以在这里获取 Shiro 的 SecurityManager,然后调用相应的方法 // 例如:SecurityUtils.getSecurityManager().getRealms().forEach(realm -> realm.getAuthorizationInfo(subject)); } @Override public void contextDestroyed(ServletContextEvent sce) { // 在项目关闭时执行一些清理操作(可选) } } ``` 2. 在 `web.xml` 文件中注册该监听器。在 `<web-app>` 标签内添加以下配置: ```xml <listener> <listener-class>com.example.ShiroAuthorizationListener</listener-class> </listener> ``` 当项目启动时,`contextInitialized()` 方法将被调用,你可以在该方法中获取 Shiro 的 SecurityManager,并调用 `getRealms()` 方法遍历所有 Realm,并执行 `getAuthorizationInfo()` 方法来主动调用 `doGetAuthorizationInfo()`。 需要注意的是,具体实现可能会根据你的项目架构和需求而有所不同。你可以根据自己的实际情况进行调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值