昨天简单的学了下springmvc,今天就来整理一下ssm的整合,这个整合是最初级的部分,也就是搭好环境,然后进行一次查询操作,并将查询到的结果返回到页面中。但是在整合的过程中,却遇到了一个非常好玩的东东,我们一会说。
现在我们先来搭一下环境。
一.所需要的jar包
其实按老师的话来说,导jar包的过程是一个很慢的过程。我们应该先导入最基本的jar包(核心包),然后当在需要另外的功能时,在导入其他的jar包,这样就会保证suo所需要导入的包刚刚够项目使用,但是又不多于。
但是我在这里就直接贴一下ssm整合的jar包,也就是这个演示DEMO所需要的所有jar包,而不慢慢的按需求导入了。
antlr.jar
aopalliance-1.0.jar
asm-3.3.1.jar
asm-attrs.jar
asm.jar
cglib-2.2.2.jar
classworlds-1.1.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-beanutils-1.7.0.jar
commons-chain-1.2.jar
commons-collections-3.2.jar
commons-dbcp.jar
commons-digester-2.0.jar
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-lang-2.4.jar
commons-logging-1.1.1.jar
commons-logging-api-1.1.jar
commons-pool.jar
commons-validator-1.3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.jar
ezmorph-1.0.4.jar
freemarker-2.3.16.jar
hibernate3.jar
javassist-3.17.1-GA.jar
javassist-3.7.ga.jar
json-lib-2.1-jdk15.jar
json-lib-2.2.2-jdk15.jar
jstl.jar
jta.jar
log4j-1.2.17.jar
mybatis-3.2.2.jar
mybatis-spring-1.2.1.jar
mysql_con_java.jar.jar
ognl-3.0.jar
oro-2.0.8.jar
persistence.jar
servlet-api.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
spring-aop-4.3.8.RELEASE-javadoc.jar
spring-aop-4.3.8.RELEASE-sources.jar
spring-aop-4.3.8.RELEASE.jar
spring-aop-5.0.2.RELEASE-javadoc.jar
spring-aop-5.0.2.RELEASE-sources.jar
spring-aop-5.0.2.RELEASE.jar
spring-aspects-4.3.8.RELEASE-javadoc.jar
spring-aspects-4.3.8.RELEASE-sources.jar
spring-aspects-4.3.8.RELEASE.jar
spring-aspects-5.0.2.RELEASE-javadoc.jar
spring-aspects-5.0.2.RELEASE-sources.jar
spring-aspects-5.0.2.RELEASE.jar
spring-beans-4.3.8.RELEASE-javadoc.jar
spring-beans-4.3.8.RELEASE-sources.jar
spring-beans-4.3.8.RELEASE.jar
spring-beans-5.0.2.RELEASE-javadoc.jar
spring-beans-5.0.2.RELEASE-sources.jar
spring-beans-5.0.2.RELEASE.jar
spring-context-4.3.8.RELEASE-javadoc.jar
spring-context-4.3.8.RELEASE-sources.jar
spring-context-4.3.8.RELEASE.jar
spring-context-5.0.2.RELEASE-javadoc.jar
spring-context-5.0.2.RELEASE-sources.jar
spring-context-5.0.2.RELEASE.jar
spring-context-indexer-5.0.2.RELEASE-javadoc.jar
spring-context-indexer-5.0.2.RELEASE-sources.jar
spring-context-indexer-5.0.2.RELEASE.jar
spring-context-support-4.3.8.RELEASE-javadoc.jar
spring-context-support-4.3.8.RELEASE-sources.jar
spring-context-support-4.3.8.RELEASE.jar
spring-context-support-5.0.2.RELEASE-javadoc.jar
spring-context-support-5.0.2.RELEASE-sources.jar
spring-context-support-5.0.2.RELEASE.jar
spring-core-4.3.8.RELEASE-javadoc.jar
spring-core-4.3.8.RELEASE-sources.jar
spring-core-4.3.8.RELEASE.jar
spring-core-5.0.2.RELEASE-javadoc.jar
spring-core-5.0.2.RELEASE-sources.jar
spring-core-5.0.2.RELEASE.jar
spring-expression-4.3.8.RELEASE-javadoc.jar
spring-expression-4.3.8.RELEASE-sources.jar
spring-expression-4.3.8.RELEASE.jar
spring-expression-5.0.2.RELEASE-javadoc.jar
spring-expression-5.0.2.RELEASE-sources.jar
spring-expression-5.0.2.RELEASE.jar
spring-instrument-4.3.8.RELEASE-javadoc.jar
spring-instrument-4.3.8.RELEASE-sources.jar
spring-instrument-4.3.8.RELEASE.jar
spring-instrument-5.0.2.RELEASE-javadoc.jar
spring-instrument-5.0.2.RELEASE-sources.jar
spring-instrument-5.0.2.RELEASE.jar
spring-instrument-tomcat-4.3.8.RELEASE-javadoc.jar
spring-instrument-tomcat-4.3.8.RELEASE-sources.jar
spring-instrument-tomcat-4.3.8.RELEASE.jar
spring-jcl-5.0.2.RELEASE-javadoc.jar
spring-jcl-5.0.2.RELEASE-sources.jar
spring-jcl-5.0.2.RELEASE.jar
spring-jdbc-4.3.8.RELEASE-javadoc.jar
spring-jdbc-4.3.8.RELEASE-sources.jar
spring-jdbc-4.3.8.RELEASE.jar
spring-jdbc-5.0.2.RELEASE-javadoc.jar
spring-jdbc-5.0.2.RELEASE-sources.jar
spring-jdbc-5.0.2.RELEASE.jar
spring-jms-4.3.8.RELEASE-javadoc.jar
spring-jms-4.3.8.RELEASE-sources.jar
spring-jms-4.3.8.RELEASE.jar
spring-jms-5.0.2.RELEASE-javadoc.jar
spring-jms-5.0.2.RELEASE-sources.jar
spring-jms-5.0.2.RELEASE.jar
spring-messaging-4.3.8.RELEASE-javadoc.jar
spring-messaging-4.3.8.RELEASE-sources.jar
spring-messaging-4.3.8.RELEASE.jar
spring-messaging-5.0.2.RELEASE-javadoc.jar
spring-messaging-5.0.2.RELEASE-sources.jar
spring-messaging-5.0.2.RELEASE.jar
spring-orm-4.3.8.RELEASE-javadoc.jar
spring-orm-4.3.8.RELEASE-sources.jar
spring-orm-4.3.8.RELEASE.jar
spring-orm-5.0.2.RELEASE-javadoc.jar
spring-orm-5.0.2.RELEASE-sources.jar
spring-orm-5.0.2.RELEASE.jar
spring-oxm-4.3.8.RELEASE-javadoc.jar
spring-oxm-4.3.8.RELEASE-sources.jar
spring-oxm-4.3.8.RELEASE.jar
spring-oxm-5.0.2.RELEASE-javadoc.jar
spring-oxm-5.0.2.RELEASE-sources.jar
spring-oxm-5.0.2.RELEASE.jar
spring-test-4.3.8.RELEASE-javadoc.jar
spring-test-4.3.8.RELEASE-sources.jar
spring-test-4.3.8.RELEASE.jar
spring-test-5.0.2.RELEASE-javadoc.jar
spring-test-5.0.2.RELEASE-sources.jar
spring-test-5.0.2.RELEASE.jar
spring-tx-4.3.8.RELEASE-javadoc.jar
spring-tx-4.3.8.RELEASE-sources.jar
spring-tx-4.3.8.RELEASE.jar
spring-tx-5.0.2.RELEASE-javadoc.jar
spring-tx-5.0.2.RELEASE-sources.jar
spring-tx-5.0.2.RELEASE.jar
spring-web-4.3.8.RELEASE-javadoc.jar
spring-web-4.3.8.RELEASE-sources.jar
spring-web-4.3.8.RELEASE.jar
spring-web-5.0.2.RELEASE-javadoc.jar
spring-web-5.0.2.RELEASE-sources.jar
spring-web-5.0.2.RELEASE.jar
spring-webflux-5.0.2.RELEASE-javadoc.jar
spring-webflux-5.0.2.RELEASE-sources.jar
spring-webflux-5.0.2.RELEASE.jar
spring-webmvc-4.3.8.RELEASE-javadoc.jar
spring-webmvc-4.3.8.RELEASE-sources.jar
spring-webmvc-4.3.8.RELEASE.jar
spring-webmvc-5.0.2.RELEASE-javadoc.jar
spring-webmvc-5.0.2.RELEASE-sources.jar
spring-webmvc-5.0.2.RELEASE.jar
spring-webmvc-portlet-4.3.8.RELEASE-javadoc.jar
spring-webmvc-portlet-4.3.8.RELEASE-sources.jar
spring-webmvc-portlet-4.3.8.RELEASE.jar
spring-websocket-4.3.8.RELEASE-javadoc.jar
spring-websocket-4.3.8.RELEASE-sources.jar
spring-websocket-4.3.8.RELEASE.jar
spring-websocket-5.0.2.RELEASE-javadoc.jar
spring-websocket-5.0.2.RELEASE-sources.jar
spring-websocket-5.0.2.RELEASE.jar
sslext-1.2-0.jar
standard.jar
struts2-convention-plugin-2.2.1.jar
struts2-core-2.2.1.jar
struts2-embeddedjsp-plugin-2.2.1.jar
struts2-json-plugin-2.2.1.jar
xwork-core-2.2.1.jar
其实这里用到jar包并不多,只不过上面的jar包 “一式三份” 才显得那么多。
二.web.xml文件
随着JavaEE写的DEMO越来越多,越来越感觉web.xml文件的重要性。在这个DEMO里,web.xml主要有3个功能,第一个功能是配置项目的欢迎页面(这个几乎所有的项目都配置),二是配置前端控制器,三是加载其他的容器(文件)。
这里所说的第二个功能,也就是配置前端控制器。这里配置有两个目的,一个是过滤用户的请求,二是加载springmvc的核心配置文件。 使用SpringMVC框架,配置DispatcherServlet(调度程序服务)(前端控制器)是第一步。 DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。DispatcherServlet是前置控制器,是配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Action)来处理。
如果我们不再DispatcherServlet(前端控制器)中配置init-param标签,那么这个前端控制器会自动加载去WEB—INF目录下加载一个叫 (‘servlet-name’-srvlet)的xml文件。如果配置了,就会按照我们指定的路径去加载文件。但是在指定路径时,我们应在路径前加上一个 classpath: 因为这样才会去tomcat服务器下的WEB-INF目录下的Classes下去加载(也就是java项目的src下),如果不写就会去tomcat的WEB-INF目录下去寻找(也就是java项目的WEB-INF目录下),所以我们应该要根据所要加载的文件的位置,而决定是否添加classpath:,还是其他的路径。
下面的就是配置的web.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>spring_mvc</display-name>
<!-- 配置欢迎页面 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 配置前端控制器============================================================================================ -->
<!-- 使用SpringMVC框架,配置DispatcherServlet(调度程序服务)(前端控制器)是第一步。
DispatcherServlet是一个Servlet,所以可以配置多个DispatcherServlet。Dis
patcherServlet是前置控制器,是配置在web.xml文件中的。拦截匹配的请求,Servlet拦
截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller(我们写的Acti
on)来处理。
“某某规则”:是根据你使用了哪个HandlerMapping接口的实现类(注解和xml方式)的不同而不同。
-->
<servlet>
<description>这个servlet是一个前端控制器,用来过滤(拦截)和分发请求</description>
<!-- 如果不进行额外的配置,那么web文件会去WEB—INF目录下加载一个叫 (‘servlet-name’-srvlet)的xml文件 -->
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置参数的初始化 -->
<init-param>
<description>去改变web文件加载的springmvc的核心配置路径</description>
<param-name>contextConfigLocation</param-name>
<!-- 这里的param-value可以有多个值,中间可以用逗号来分割,并且如果不写的时候,会使用默认值 -->
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- web容器所要监听(加载)的内容 ====================================================================================-->
<!-- 使用监听器listener来加载配置 -->
<listener>
<description>在web容器被创建时,自动加载哪些容器(文件)</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指明listener要具体加载那些容器(文件) -->
<context-param>
<description>指明listener要具体加载那些容器(文件)</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-common.xml</param-value>
</context-param>
</web-app>
而且,在web文件中还配置了监听器,也就是上面所说的第三个用处。这里的监听器Listener主要就是监听所要加载的内容。被它监听的参数,在web容器被创建时,就会加载或创建(容器)。
这个文件就指明了当web容器创建时,就加载spring-common.xml文件(容器)。这与上面的servlet标签中的init-param是不一样的,只有当servlet被访问时,才会初始化参数,才会去加载springmvc-servlet.xml文件(容器)。
今天由于一时兴起,在写代码的时候,这样配置了web.xml文件。
也就是监听了两个参数,这就出现了问题。因为同时加载了 两个“父容器 ”。
三.spring-common.xml
spring-common.xml 文件也就是ssm项目整合的文件。在这里首先配置了数据源,指定了mybatis框架要操作的数据库。接着配置了mybatis框架的核心sqlSessionFactoryBean,其中的两个属性dataSource和mapperLocations将sqlSessionFactoryBean和数据库和操作数据库的方法联系起来。
下面也就是spring集成mybatis,配置MapperScannerConfigurersh实例,使将操作数据库的方法变成bean,放到IOC容器中。
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:mvc = "http://www.springframework.org/schema/mvc"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 扫描包 -->
<context:component-scan base-package="com.java"/>
<!-- 配置数据源,指定要操作的数据库 -->
<bean id="basicdataSource" class="org.apache.commons.dbcp.BasicDataSource" scope="singleton">
<property name="url" value="jdbc:mysql://localhost:3306/ssgl"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
</bean>
<!-- mybatis框架的核心 sqlSessionFactory -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="basicdataSource"></property>
<property name="mapperLocations">
<value>classpath:com/java/daomapper/*Mapper.xml</value>
</property>
</bean>
<!-- spring 集成 mybatis -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.java.dao"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"></property>
</bean>
</beans>
在spring-common.xml文件中,还有最重要的一步,就是扫描包,扫描包之后,会将对应注解修饰的类生成bean放到IOC容器中,并把相对应的对象属性注入进去。
四.springmvc-servlet.xml
在这个文件中,我只配置了一个扫描包。其他的功能被注释注上了,在这个demo中并没有被演示。
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context = "http://www.springframework.org/schema/context"
xmlns:mvc = "http://www.springframework.org/schema/mvc"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 扫描包,寻找所用的注解 -->
<context:component-scan base-package="com.java.controller"></context:component-scan>
<!-- 默认的注解映射的支持(发挥注解的作用)
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学者快速应用默认配置方案。
<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandle
rAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。
<mvc:annotation-driven/>
-->
<!-- 配置试图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value=""></property>
<property name="suffix" value=""></property>
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
</bean>
-->
<!-- 配置拦截器
<mvc:interceptors>
<bean class="com.java.Inteceptors.MyInteceptor"/>
</mvc:interceptors>
-->
<!-- 对静态资源的访问(例如js,img等)
<mvc:resources mapping="" location=""></mvc:resources>
<mvc:resources mapping="" location=""></mvc:resources>
-->
<!-- 对静态资源文件的访问 方案一 (二选一)
<mvc:default-servlet-handler/> 使用默认的servlet来响应静态文件。
<mvc:default-servlet-handler/>
-->
</beans>
今天先码一个疑问,既然在spring-common.xml文件中已经扫描过了com.java.controllerba包,那么在springmvc-servlet.xml文件中在扫描一次com.java.controllerba包是不是多此一举呢?
五.UserMapper.xml 和 UserMapper.java
这里的查询操作是3表联查,即在xml文件中,指定了要实现的接口,并实现了方法(我们可以把这个xml文件看作是UserMapper.java接口的实现类)。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入所需要的约束,用来约定在该xml文件中能够使用的标签,并在写标签的时候有提示功能 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 进行接口方法的映射和实现 -->
<mapper namespace="com.java.dao.UserMapper">
<resultMap id="resultMap" type="com.java.Bean.User">
<!-- 这个resultMap仅仅是一个结果集,定义了要返回给user对象的所有属性值,
只有写了sql语句,指明了查询的表名,和所关联的其他表的时候,才能将对应的
字段给对应的属性
-->
<!-- 数据库的字段如果和实体类中属性名称一致时(不区分大小写),那么就可以不定义属性。 -->
<result column="userid" property="userId" javaType="string"></result>
<result column="userpassword" property="userPassword" javaType="string"></result>
<result column="username" property="userName" javaType="string"></result>
<result column="usersex" property="userSex" javaType="string"></result>
<result column="userrole" property="userRole" javaType="string"></result>
<result column="usercollege" property="userCollege" javaType="string"></result>
<result column="usermajor" property="userMajor" javaType="string"></result>
<result column="userclass" property="userClass" javaType="string"></result>
<!-- 站在多方配置一方信息使用association -->
<association property="dormitory" javaType="com.java.Bean.Dormitory">
<result column="dormitoryid" property="dormitoryId"/>
<result column="planpersons" property="planPersons"/>
<result column="realpersons" property="realPersons"/>
<result column="waterprice" property="waterPrice"/>
<result column="powerprice" property="powerPrice"/>
<result column="grade" property="grade"/>
</association>
<!-- 站在一方角度配置多方信息 -->
<collection property="lates" ofType="com.java.Bean.Late">
<result column="lateid" property="lateId"/>
<result column="latetime" property="lateTime"/>
</collection>
</resultMap>
<select id="select_user_one" parameterType="com.java.Bean.User" resultMap="resultMap">
<!-- 在将两个表联系起来以后,如果想访问原来表中的属性,那么直接就可以用表名.属性的方式。
-->
select * from t_user
join t_dormitory
on t_user.dormitoryid=t_dormitory.dormitoryid
join t_late
on t_user.userid=t_late.userid
where t_user.userid=#{userId}
</select>
</mapper>
其实,在进行属性注入的时候,应该在是实现类的类上面添加对应的注解(如service,controller等)。但是由于dao接口的 “实现类” 是以如上所示的xml文件的形式存在的,所以这里有点特殊,将注解放在dao接口上。如下:
package com.java.dao;
import org.springframework.stereotype.Repository;
import com.java.Bean.User;
@Repository("userMapper")
public interface UserMapper {
public User select_user_one(User user);
}
六.UserService.java和UserServiceImpl
这两个文件是service层的,和 上面的不同点,将注解修饰在了实现类上。
package com.java.service;
import org.springframework.stereotype.Service;
import com.java.Bean.User;
public interface UserService {
public User select_user_one(User user);
}
package com.java.serviceImpl;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.java.Bean.User;
import com.java.dao.UserMapper;
import com.java.service.UserService;
@Service("userServiceImpl")
public class UserServiceImpl implements UserService{
//属性注入,用注解方式,不用提供set方法
@Autowired
private UserMapper userMapper;
@Override
public User select_user_one(User user) {
User user_return=userMapper.select_user_one(user);
return user_return;
}
}
在提一嘴,@Autowired注解是按类型进行注入的,如果IOC容器中,没有所需要注入的类型或子类类型,那么就会发生异常。
七.controller控制器
通过由在web.xml文件中配置的前端控制器过滤的用户请求(路径),将被分发到合适(对应)的controller中,而这就是一个自己编写的处理对应请求的controller。
package com.java.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.java.Bean.User;
import com.java.service.UserService;
/*1.
*2.方法可以私有吗?
**/
@Controller //被@Controller注解所修饰的类说明是一个控制器,用来处理请求的(类似action)
@RequestMapping("/controller1")
public class Controller1 {
//定义UserService属性
@Autowired
private UserService userService;
@RequestMapping("/method_1")
public String method_1(User user2,HttpServletRequest request) {
User user_return=userService.select_user_one(user2);
System.out.println(user_return);
request.getSession().setAttribute("user",user_return);
Map<String,Object> map=new HashMap();
map.put("user1",user_return);
request.setAttribute("map",map);
return "forward:/index.jsp";
}
}
通过controller注解说明这是一个控制器(也就相当于struts2中的action)。通过@RequestMappoingxi修饰的类和方法,就可以通过url来访问指定类的指定方法了。在这个controllerzho中,首先查询了用户,然后通过session和request的方式来返回给页面,这里用的是默认的请求转发,而不是重定向,因为一旦重定向,那么放到当前请求的request参数在另一给请求中将不会被访问到。
但是重定向对于session来说是没有影响的,因为session的作用域是一次会话,只要浏览器的页面不被关闭(一个页面的多个窗口共用一个session对象),那么就能够访问到存储到session对象中属性。
八.用于接收数据的index.jsp页面
当我们在超链接中添加访问路径时,最好是从项目名开始的路径,这样每次访问都是从唯一的一个路径访问的,不会出现路径叠加的问题(无论连续点击多少次)。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<%String path=request.getContextPath(); %>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="<%=path%>/controller1/method_1.do?userId=1">点击将数据返回到该超连接的后面</a>${user}
<br/>
通过map集合返回回来的user:${map}
</body>
</html>
这里通过session和request中的map集合两种方式来返回,接收而是直接通过key的方式来获取值。
九.好玩的事
哇,写了这么久,好玩的事情终于来了!!!!!
下面我们就说一下这个好玩的事。
在新打开一个浏览器,首次点击超链接时,会出现下面的数据:
点击后,会出现如下的数据:
明明在控制台打印出了查询出来的数据,也则正确,但是为什么返回的时候确实只有一个“1”的user呢?而切通过map返回的值却没有错呢?
为了知道原因,我们刷新一下页面,再来看看。显示如下:
当我们再次点击超链接后,又会出现之前的返回情况:
看到这里我好像忽然明白了什么。
原来在开启浏览器时,浏览器中并没有session数据,也没有request数据,所以页面上没有数据显示,就像上面的截图一样。但是当我们访问了controller时,由 url 传递过去的userId被springmvc自动封装到了user对象中,并把这个对象保存到request对象中,key值为User这个类的首字母小写user,注意这个key值user和我自己保存的参数key相同。而在显示页面上,我并没有指定读取哪一个作用域中的user key,所以它会默认从作用域小的request对象中寻找,于是把springmvc框架自动保存到request对象中的user取了出来显示。
那为什么在次访问 localhost:8080/spring_web/ 路径会显示正常的呢?
那是因为此时的请求还没有经过controller,所以request中并没有user对象,所以只能从浏览器会话中的session中取,所以显示的数据是正常的。
至于为什么点击之后,又变成原来的样子,那么因为框架又把 “模型驱动” 的user存放到了request对象中,并在显示页面显示了出来。
既然原因知道了,那么解决方案也就自然而然的出来了,我们可以在显示页面指定显示的user在哪一个作用域,比如:
这样就只定只显示session域中的user对象。
我们也可以更改自定义的request参数key,例如将key从user变成user1,然后在显示页面显示key为user1的user数据。
上述两种方式都能解决问题。
呼,完事了,手指疼。。。。。。。。。。。。。。。。。。。。。。。