在spring mvc.xml中没有配置注解驱动
那么
其对应的实现类是org.springframework.web.servlet.config.AnnotationDrivenBeanDefinitionParser。
通过阅读类注释文档,发现这个类主要是用来向工厂中注册了
RequestMappingHandlerMapping
BeanNameUrlHandlerMapping
RequestMappingHandlerAdapter
HttpRequestHandlerAdapter
SimpleControllerHandlerAdapter
ExceptionHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
上面几个Bean实例。这几个类都是用来做什么的呢?
前两个是HandlerMapping接口的实现类,用来处理请求映射的。其中第一个是处理@RequestMapping注解的。第二个会将controller类的名字映射为请求url。
中间三个是用来处理请求的。具体点说就是确定调用哪个controller的哪个方法来处理当前请求。第一个处理@Controller注解的处理器,支持自定义方法参数和返回值(很酷)。第二个是处理继承HttpRequestHandler的处理器。第三个处理继承自Controller接口的处理器。
后面三个是用来处理异常的解析器。
在adminHeader.jsp中要引入webapp下的css、img和js等资源文件,如果使用相对路径访问会发生错误,所以这里采用绝对路径的访问方法,即在访问的路径前加上项目名。
tomcat部署时有两种部署方式:war和war exploded。
区别:
war模式:将web工程以包的形式上传到服务器
工程target目录下会生成war包, 并且解压后的war包会被部署到tomcat的webapp 目录下。注意:如果application-context 设置为 /, tomcat目录下不会有解压后的war文件,只有指定文件目录,才会生成文件夹,这个文件夹作为项目的根目录。
war exploded模式:将web工程以当前文件夹的位置关系上传到服务器
此时在tomcat的文件目录中不会有解压的war文件夹。如果用idea, 它会在${user.home}/.IntelliJIdea/system/tomcat 目录下生成项目的文件夹,里面包含了tomcat的配置,日志等信息。
/conf/Catalina/localhost 目录下有 *.xml 配置文件,指定了项目的路径
就是工程目录中target里的未压缩的war文件。
两种部署方式获取上下文路径
获取上下文环境绝对路径的代码:
String contextPath = request.getSession().getServletContext().getRealPath("/");
war模式获取到的是tomcat的所在位置
war exploded模式取到的是项目target的位置
2.1 修改productsAsideCategorys.jsp
在遍历分类对应的商品时,修改字段c.productsRow。保持和pojo中的属性一致。
2.2 修改homepageCategoryProducts.jsp
显示全部商品时,图片的显示一定要与Product中的字段一致。
若一个类实现了Comparable接口,就意味着“该类支持排序”。 假设“有一个List列表(或数组),里面的元素是实现了Comparable接口的类”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:
第一种直接对list进行排序
public static > void sort(List list) {
list.sort(null);
}
第二种可以自定义排序规则,实现Comparator接口就可以了。
public static void sort(List list, Comparator super T> c) {
list.sort(c);
}
前端中有商品排序功能,需要提供五个比较器:综合、人气、新品、销量和价格。
给出一个示例:
自定义排序规则
package comparator;
import com.li.tmall.pojo.Product;
import java.util.Comparator;
/**
* @Author: 98050
* Time: 2018-09-27 23:16
* Feature:
*/
public class ProductAllComparator implements Comparator {
@Override
public int compare(Product o1, Product o2) {
return o2.getReviewCount()*o2.getSaleCount() - o1.getReviewCount()*o1.getSaleCount();
}
}
Controller中调用
最简单的将用户对象存放在session中。
前端页面要显示订单成交记录数,所以必须是买家确认收货后,才算是真正的订单完成。
因为数据库中外键的约束,在后台进行删除操作时会发生异常,要进行级联删除。
页面右上角购物车中的商品数量不能实时刷新