常见名词
` 名词 Filter 过滤器 Listener 监听器 Interceptor 拦截器 Dispatcher 控制器 Dispatcher Servlet 前端控制器 Handler 处理器 Handler Adapter 处理器适配器 Resolver 解析器 View Resolver 视图解析器 redirect 重定向 Component 组件 Required 必须的 Repository 仓库 Variable 变量 Path Variable 可变参数 Param 参数 RequestParam 请求参数 Mapping 映射 Request Mapping 请求映射
spring-mvc
Spring注解
IOC
注解 | 说明 |
---|---|
@Component | 使用在类上用于实例化Bean |
@Controller | 使用在web层类上用于实例化Bean |
@Service | 使用在service层类上用于实例化Bean |
@Repository | 使用在dao层类上用于实例化Bean |
@Autowired | 使用在字段上用于根据类型依赖注入 |
@Value | 注入普通属性 |
新注解 | 说明(常用于测试类) |
@Configuration | 用于指定当前类是一个 Spring 配置类(可以加载spring配置文件) |
@Bean | 使用在方法上,标注将该方法的返回值存储到 Spring 容器中 |
@PropertySource | 用于加载.properties 文件中的配置 |
@Import | 用于导入其他配置类 |
@ComponentScan | 和<context:component-scan base-package=“com.itheima”/>一样 |
@Runwith | 替换原来的运行期 ( 测试时加上 ) |
aop
AOP 名词 | 相关概念 |
---|---|
Target | 代理的目标对象 |
Proxy | 代理类 |
Pointcut | 切入点 (被增强的方法) |
Advice | 通知 (封装增强业务逻辑的方法) |
Aspect | 切面 (切入点和通知的结合) |
Weaving | 织入 (将切点与通知结合的过程) |
Target target = new Target(); //创建目标对象
//创建代理对象
TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass()
.getClassLoader(),target.getClass().getInterfaces(),new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("前置增强代码...");
Object invoke = method.invoke(target, args);
System.out.println("后置增强代码...");
return invoke;
}
}
);
public class CglibTest {
@Test
public void test01() {
// 1: 创建增强
Enhancer e = new Enhancer();
// 2: 设置父类
e.setSuperclass(Aa.class);
// 3: 设置回调
e.setCallback(new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
new Ccc().before();
Object invoke = method.invoke(new Aaa(), args);
return invoke;
}
});
// 4: 创建代理对象
Aa aa = (Aa) e.create();
aa.save();
}
}
<!--配置目标类-->
<bean id="target" class="com.itheima.aop.Target"></bean>
<!--配置切面类-->
<bean id="myAspect" class="com.itheima.aop.MyAspect"></bean>
<aop:config>
<!--引用myAspect的Bean为切面对象-->
<aop:aspect ref="myAspect">
<!--配置Target的method方法执行时要进行myAspect的before方法前置增强-->
<aop:before method="(通知方法名称)" pointcut="execution(切面表达式)"></aop:before>
</aop:aspect>
</aop:config>
<!--切点表达式的写法:-->
<execution([修饰符] 返回值类型 包名.类名.方法名(参数))>
<!--前置通知-->
<aop:before>>method="(通知方法名称)" pointcut="exexcution(切面表达式)"</aop:before>
<!--后置通知--><aop:after-returming>
<!--环绕通知--><aop:around>
<!--异常抛出通知--><aop:throwing>
<!--最终通知--><aop:after>
@Around("advice()")
public void around(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("循环前.......");
Object p = pjp.proceed();
System.out.println("循环后........");
}
WEB.XML配置
处理中文乱过滤器
<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>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置监听器
<!--配置监听器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--加载application文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
配置控制器
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
Spring配置
Spring.xml配置
<context:component-scan base-package="com.itheima.controller"/>
<mvc:annotation-driven/> 后边可以有参数
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="com.itheima.converter.DateConverter"></bean>
</list>
</property>
</bean>
public class DateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
//将日期字符串转换成日期对象 返回
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/"/> 前缀
<property name="suffix" value=".jsp"/> 后缀
</bean>
<context:property-placeholder location="classpath:druid.properties"/>
<import resource="applicationContext-xxx.xml"/>
Controller注解
请求
@RequestMapping(
value=“映射url路径”, 于指定请求的UR
mathod=“RequestMethod.GET(POST…)” 用于指定请求的方式
params 请求参数的key和value必须和配置的一模一样 )
@RequestHeader(“Host”) String host, 获取请求头数据
@RequestParam(value=“xxx”,required=false)false表示可以不携带xxx,默认true
@ 将值和url绑定,使用{xxx}进行占位符
数据请求方式
参数 | 例子 |
---|---|
基本类型 | public void save(String username,int age) |
POJO | public void save11(User user) |
数组类型 | public void save11(String[] strs) |
集合 | public void save11(List userlist) |
相应
@RsponseBody页面跳转
Model注解 | ||
---|---|---|
Service | 在service层配置 | |
Repository | 在dao层配置 | |
Autowired | 注入Bean |
数据源基础配置
properties文件
db.driverClassName=com.mysql.jdbc.Driver
db.urlName=jdbc:mysql://127.0.0.1:3306/spring
db.username=root
db.password=root
文件上传
单文件
poom文件
<!--文件上传坐标-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
前台代码
<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">
名称<input type="text" name="username"><br/>
文件1<input type="file" name="uploadFile"><br/>
文件2<input type="file" name="uploadFile"><br/>
<input type="submit" value="提交">
</form>
spring-mvc.xml
<!--配置文件上传解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="500000"/>
</bean>
后台程序
@RequestMapping(value="/quick22")
@ResponseBody
public void save22(String username, MultipartFile uploadFile) throws IOException {
System.out.println(username);
//获得上传文件的名称
String originalFilename = uploadFile.getOriginalFilename();
//存储位置
uploadFile.transferTo(new File("C:\\upload\\"+originalFilename));
}
多文件
前台代码
<form action="${pageContext.request.contextPath}/user/quick23" method="post" enctype="multipart/form-data">
名称<input type="text" name="username"><br/>
文件1<input type="file" name="uploadFile"><br/>
文件2<input type="file" name="uploadFile"><br/>
<input type="submit" value="提交">
</form>
后台代码
@RequestMapping(value="/quick23")
@ResponseBody
public void save23(String username, MultipartFile[] uploadFile) throws IOException {
System.out.println(username);
for (MultipartFile multipartFile : uploadFile) {
String originalFilename = multipartFile.getOriginalFilename();
multipartFile.transferTo(new File("C:\\upload\\"+originalFilename));
}
}
Interceptor拦截器
java代码实现拦截器接口
public class MyInterceptor implements HandlerInterceptor {
//在目标方法执行之前 执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
System.out.println("preHandle.....");
String param = request.getParameter("param");
if ("yes".equals(param)){
return true;//返回true 放行,返回false 不放行
}else {
response.sendRedirect("/error.jsp");
return false;
}
}
//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
modelAndView.addObject("name","hahaha");
System.out.println("postHandle...");
}
//在流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion....");
}
}
spring-mvc中配置拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!--对哪些资源执行拦截操作-->
<mvc:mapping path="xxx/**"/>
<bean class="com.itheima.Interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>