大家好,我在做springMVC 代替了struts ,使用注解进行了action
的配置,并且把所有的jsp页面都放到了WEb-INF目录下,导致了无法直接访问jsp页面的问题。然后我的action类当多出来了很多没有用的action,如下:
    /**
     * 跳转到模块管理页面
     * spring转发到模块管理页面
     * @return
     * @see [类、类#方法、类#成员]    
     */
    @RequestMapping(value = "module/qryModuleList", method = RequestMethod.GET)
    public String qryModuleList()
    {
        return "module/module";
    }
就是去找module.jsp   但是这个方法好多余呀。  请问 有没有更好的办法?请指教,小弟刚刚开始用springmvc新手。   springjspstrutsaction

解决方案 »

  1.   

    我不明白你为什么把jsp放到WEb-INF目录下面
    个人感觉放到WebRoot下面或者自己创建一些目录更合适一些。
    spring突然感觉我自己学的也好差。以后也得重新开始学了。
      

  2.   

    放到WEB-INF下的jsp,要跳转才行你可以搞这个
        @RequestMapping(value = "{id}", method = RequestMethod.GET)
        public String getWelcomeView(@PathVariable String id,
                HttpServletRequest request)
        {
            request.setAttribute("selectpath", id);
            return  id;
        }这样你要请求a页面, 就访问a.(你mvc的后缀),就会转到a.jsp,
    这就是根据你路径来返回
      

  3.   


    public class BaseContoller{
    public static final String COMMON_FAIL_PAGE = "fail_page";
    public static final String COMMON_FAIL_ALERT = "fail_message";
    public static final String USER_SESSION_KEY = "user_session"; // 处理JSP页面的直接访问
    @RequestMapping("/{jsp}.do")
    public String jsp(@PathVariable(value = "jsp") String jspStr) { return jspStr;
    }

    }之后让所有的Contoller类继承他就能直接访问jsp了
      

  4.   

    也可以直接写在controller类里,你自己看着办吧,不过我个人认为还是继承的好
      

  5.   

    继承了以后tomcat 启动就报错了,
    错误如下
    严重: StandardWrapper.Throwable
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'moduleAction' bean method 
    public java.lang.String net.huatech.framework.core.ActionFilter.jsp(java.lang.String)
    to {[/{jsp}.htm],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'menuAction' bean method
    public java.lang.String net.huatech.framework.core.ActionFilter.jsp(java.lang.String) mapped.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
      

  6.   

    因为我暂时有两个Action类,都继承了这个baseController。好像是实例化的时候重复了???怎么办?
      

  7.   

    你注意一下规范,Action应该使用*.do,在web.xml加入 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    </filter-mapping>
      

  8.   


    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <filter>
    <filter-name>encodingFilter</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>
    <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>
    <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.do</url-pattern>
    </filter-mapping>

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/springmvc-servlet.xml</param-value>
    </context-param>
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet>
    <servlet-name>runInit</servlet-name>
    <!-- 初始化 -->
    <servlet-class>cn.com.newdt.travelitinerary.core.AutoInitServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
    </servlet>


    <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping> <!-- 出错页面定义 -->
    <error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error/500.jsp</location>
    </error-page>
    <error-page>
    <error-code>500</error-code>
    <location>/error/500.jsp</location>
    </error-page>
    <error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
    </error-page>
    <error-page>
    <error-code>403</error-code>
    <location>/error/403.jsp</location>
    </error-page> <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    </web-app>
    <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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans   
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
               http://www.springframework.org/schema/context   
               http://www.springframework.org/schema/context/spring-context-3.0.xsd"
    default-autowire="byName">
    <!-- 事务  -->
    <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
    </bean> <!-- 数据源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/test" />
    <property name="username" value="root" />
    <property name="password" value="admin" /> <!-- 连接池启动时的初始值 -->
    <property name="initialSize" value="1" /> <!-- 连接池的最大值 -->
    <property name="maxActive" value="300" /> <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
    <property name="maxIdle" value="2" /> <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
    <property name="minIdle" value="1" />
    </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
    </bean> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
    <list>
    <bean
    class="org.springframework.http.converter.StringHttpMessageConverter">
    <property name="supportedMediaTypes">
    <list>
    <!-- 解决JOSN字符串乱码问题 -->
    <value>text/html;charset=UTF-8</value>
    </list>
    </property>
    </bean>
    <!-- JSON对象注解 -->
    <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
    </list>
    </property>
    </bean>

    <!-- 自动扫描controller bean,把作了注解的类转换为bean -->
    <context:component-scan base-package="cn.com.newdt.travelitinerary" />
    <context:component-scan base-package="cn.com.newdt.rtms" />
    <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
    <!-- bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /--> <!-- 拦截器,检验用户是否登陆等 -->
    <bean id="authorizeInterceptor" class="cn.com.newdt.travelitinerary.core.AuthorizeInteceptor" /> <bean id="handlerMapping"
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
    <list>
    <ref bean="authorizeInterceptor" />
    </list>
    </property>
    </bean> <!-- 对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
    value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="0" />
    </bean> <!-- 总错误处理-->
    <bean id="exceptionResolver"
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="defaultErrorView" value="/error/error" />
    <property name="defaultStatusCode" value="500" />
    <property name="warnLogCategory"
    value="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver" />
    </bean> <!-- 国际化 -->
    <bean id="messageSource"
    class="org.springframework.context.support.ResourceBundleMessageSource">
    <property name="basenames">
    <list>
    <value>i18n/messages</value>
    </list>
    </property>
    <property name="useCodeAsDefaultMessage" value="true" />
    </bean>
    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" /> 
    <!-- 国际化 end-->


    </beans>  
      

  9.   

    问题好像不是出现在这里吧?.do   .htm  只是个后缀吧?对这个错误没有直接影响吧!?
      

  10.   

    controller的话个人觉得还是不要继承自其他类好(不知都反射机制会不会帮你继承其他类),还有jsp不要调用dao层和service层哦,采用controller配视图的话可以起到隐藏你的真实的页面url的目的,而且jsp不会被直接访问到,这是很重要的。如果你是想省略掉这个只有一行代码的方法记忆中spring mvc好像是有这样的xml配置的,你可以搜一下,我现在没有开发环境,不能帮你试。如果你不用传参数的话可以写成一个静态的html页面,然后在*-servlet.xml配上形如<mvc:resources location="/img/" mapping="/img/**" />,那么webcontent根目录下的img文件夹就会被视为静态资源可以直接访问了,具体可以参考一下我的博客http://blog.csdn.net/qgmzzn1/article/details/8465969
      

  11.   

    <!-- ================== Spring View Resolver Definition ================================= -->
    <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass"
    value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
    </bean>