1, 新建包或导入工程错误提示:
The type javax.servlet.ServletContext cannot be resolved. It is indirectly referenced from required .class files。 解决方法:在安装的tomcat下的lib目录里面找到servlet-api.jar包,导入项目下的lib文件夹中即可。2,Could not load the Tomcat server configuration at /Servers/Tomcat v7.0 Server at localhost-config. T
Eclipse新建Server时,会在 当前workspace目录下新建 /Servers/Tomacat v7.0 Server at localhost-config目录,
然后将/opt/ apache-tomacat-7.0.59/conf 目录下的所有文件拷贝到这里。Eclipse没有访问它的权限,所以无法拷贝,那么Server自然创建失败。解决方法:删了重建
3,@RequestParam传参解决中文乱码
1)post方法 @RequestMapping(value="login.do", produces="text/html;charset=utf-8") -->login.do 表单提交地址2)get方式
String user=new String(username.getBytes("iso-8859-1"),"utf-8"); String pwd=new String(password.getBytes("iso-8859-1"),"utf-8"); -->注意,如果进来的是中文未乱码,此方法转换返回 ????4,服务器启动
Result Maps collection already contains value forxxx”的解决方案 -->Eclipse编译了一份在bin目录下,将bin目录或者WEB-INF下class目录清空即可5,注入null和空字符串值
<bean id="student" class="com.spring.entity.Student"> <property name="stuName"> <null /> </property> </bean><bean id="student" class="com.spring.entity.Student">
<property name="stuName"> <value></value> </property> </bean>6,Bean的作用域
<bean id="student" class="com.spring.entity.Student" scope="singleton"/> singleton : 默认值,Spring以单例模式创建bean的实例,即容器中该bean的实例只有一个 prototype : 每次从容器中获取bean时,都会创建一个新的实例 request : 用于web应用环境,针对每次http请求都会创建一个实例 session : 用于web应用环境,同一个会话共享用一个实例,不同的会话使用不同的实例 global session : 仅在Portlet的web应用中使用,同一个全局会话共享一个实例;对于非Portlet环境,等同于session ===>使用 request,session,global session 需要在 web.xml 中配置一个请求监听器 <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener>7,注解
@Component("xxxx") : 标注一个普通的Spring Bean类 @Repository("xxxx") : 用于标注DAO类 @Service("xxxx") : 用于标注业务类 @Controller("xxxx") : 用于标注控制器类 添加命名空间: xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd" <!-- 扫描包中注解标注的类 --> <context:component-scan base-package=" 包名 "></context:component-scan>@Scope() : 指定bean的作用域
@Autowired : 自动装配8,AOP aspect oriented programming
增强 advice 切入点 pointcut 连接点 joinpoint 切面 aspect 代理 proxy 目标对象 target 织入 weaving 示例: <!-- 声明切面类 --> <bean id="testLogger" class="com.spring.logger.TestLogger" /> <aop:config> <aop:pointcut expression="execution(* com.spring.service.impl.*.*(..))" id="pointcut"/> <aop:aspect ref="testLogger"> <aop:before method="beforeLogger" pointcut-ref="pointcut"/> </aop:aspect> </aop:config> execution : 切入点指示符,括号中是切入点表达式 public * addUser(com.entity.User) : "*" 表示匹配所有类型的返回值 , 方法名( 参数 ) public void *(com.entity.User) : "*" 表示匹配所有方法名 public void addUser(..) : ".." 表示匹配所有参数个数和类型 * com.service.*.*(..) : 表示匹配 com.service 包下所有类的所有方法 * com.service..*(..): 表示匹配 com.service 包及其子包下所有类的所有方法9,增强处理类型 Before : 前置增强处理,在目标方法前织入增强处理 AfterReturning : 后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理 AfterThrowing : 异常增强处理,在目标方法抛出异常后织入增强处理 After : 最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理 Around : 环绕增强处理,在目标方法的前后都可以织入增强处理 示例: public void afterReturningLogger(JoinPoint jp, Object result){ 执行方法的名称-->jp.getSignature().getName() 方法的参数-->jp.getArgs()[0] 方法返回的值:"+result ===><aop:after-returning method="afterReturningLogger" pointcut-ref="pointcut" returning="result"/> 获取方法返回值需加 returning 属性 >环绕增强 : 第一个参数必须是 ProceedingJoinPoint ,并且使用 pjp.proceed() 调用目标方法 public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("aop:around 方法"); System.out.println("aop:around 目标方法前执行----------------->"); pjp.proceed(); System.out.println("aop:around 目标方法后执行----------------->"); } ---><aop:around method="around" pointcut-ref="pointcut"/>10,设值注入 和 构造注入
设值注入 : 通过setter访问器实现,灵活性好,时效性差 构造注入 : 通过构造方法实现,灵活性差,时效性好设值输入示例:
public void setStudentDao(StudentDao studentDao) { this.studentDao = studentDao; }<bean id="studentDaoImpl" class="com.spring.dao.impl.StudentDaoImpl" />
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl"> <property name="studentDao"> <ref bean="studentDaoImpl"/> </property> </bean> 构造方法注入: public GradeServiceImpl(GradeDao gradeDao) { this.gradeDao = gradeDao; }<bean id="gradeDao" class="com.spring.dao.impl.GradeDaoImpl"></bean>
<bean id="gradeServiceImpl" class="com.spring.service.impl.GradeServiceImpl"> <!-- 使用构造方法为 gradeService 的 gradeDao 属性赋值--> <constructor-arg> <ref bean="gradeDao"/> </constructor-arg> </bean>调用实例工厂方法创建Bean
factory-bean: 该属性的值为工厂Bean的id。 factory-method: 该属性指定实例工厂的工厂方法。 <bean id="dateFormat" class="java.text.SimpleDateFormat"> <constructor-arg value="yyyy-MM-dd" /> </bean> <bean id="grade" class="com.spring.entity.Grade"> <property name="date"> <bean factory-bean="dateFormat" factory-method="parse"> <constructor-arg value="2017-06-06" /> </bean> </property> </bean> 11,使用 p 命名空间注入bean的属性 property 注入: <bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl"> <property name="studentDao"> <ref bean="studentDaoImpl"/> </property> </bean>p命名: 添加 xmlns:p="http://www.springframework.org/schema/p"
<bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl" p:studentDao-ref="studentDaoImpl" />注意:
对于直接量(基本数据类型,字符串)属性,使用方式如下: p:属性名 = "属性值" 对于引用Bean的属性,使用方法如下: p:属性名-ref = "bean的ID"12,使用内部bean 如果一个bean组件仅在一处使用,可以把它定义为内部bean <bean id="studentServiceImpl" class="com.spring.service.impl.StudentServiceImpl"> <property name="studentDao"> <bean class="com.spring.dao.impl.StudentDaoImpl"/> <-------- </property> </bean>13, bean 和 local 的区别
<property name="studentDao"> <ref bean="studentDaoImpl"/> 或 <ref local="studentDaoImpl"/> </property> local属性只能在同一个配置文件中检索bean的ID,而使用bean属性可以在其他配置文件中检索ID14,注入集合类型
<property name="hobbies"> <list> <value>xxxx</value> 或 <ref bean=""/> <value>xxxx</value> </list> </property><property name="hobbies">
<set> <value>xxxx</value> 或 <ref bean=""/> <value>xxxx</value> </set> </property><property name="hobbies">
<map> <entry> <key> <value>xxxx</value> </key> <value>xxxx</value> </entry> <entry> <key> <value>xxxx</value> </key> <value>xxxx</value> </entry> </map> </property>====> <entry key="xx" value="xxxx" /> 简写形式
Properties类型:
<property name="hobbies"> <props> <prop key="xxx">xxx</prop> <prop key="xxx">xxx</prop> </props> </property>15,使用接口实现增强方法
implements AfterReturningAdvice implements MethodBeforeAdvice implements MethodInterceptor 示例: public class ServiceAdvice implements MethodBeforeAdvice{} <bean id="serviceBeforeAdvice" class="com.spring.logger.ServiceAdvice"></bean> <aop:config> <aop:pointcut expression="execution(* com.spring.service.impl.GradeServiceImpl.*(..))" id="gradeservice_cut"/> <aop:advisor advice-ref="serviceBeforeAdvice" pointcut-ref="gradeservice_cut"/> </aop:config>使用POJO普通类实现增强方法 (推荐)
public class TestLogger {} <bean id="testLogger" class="com.spring.logger.TestLogger" /> <aop:config> <aop:pointcut expression="execution(* com.spring.service.impl.StudentServiceImpl.*(..))" id="pointcut"/> <aop:aspect ref="testLogger"> <aop:around method="around" pointcut-ref="pointcut"/> </aop:aspect> </aop:config>15,ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
两种方法: a. ClasspathResource res = new ClasspathResource(“a.xml,b.xml,……”); 多个资源文件路径之间可以是用” ,; /t/n”等分隔。 b. ClasspathResource res = new ClasspathResource(newString[]{“a.xml”,”b.xml”,……}); 16,bean组件, 通过无参构造方法实例化对象,setter方法设值