发表于: 2018-06-09 23:52:05
1 909
今天完成的事情:
昨天虽然按how2j网站的教程跑了一遍Spring MVC框架的一些应用,但是今天对比师兄demo,发现自己很多没做对,故重新配置跑了一遍,做了相关总结。
一、重新跑了一遍提交表单数据。
1.首先设置一个实体类,储存数据。
public class Product {
private int id;
private String name;
private float price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
2.在webapp文件夹下建立addProduct.jsp,并且需要在web.xml文件中设置主页。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<form action="/product/add">
产品名称: <input type="text" name="name" value="" ><br />
产品价格: <input type="text" name="price" value=""><br />
<input type="submit" value="增加商品">
</form>
<!--welcome pages-->
<welcome-file-list>
<welcome-file>addProduct.jsp</welcome-file>
</welcome-file-list>
3.设置展示页面showProduct.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%--将方法参数里面的product拿出来对应下面的product--%>
产品名称为: ${product.name}<br>
产品价格为: ${product.price}
4.设置ProductController,其可以在主页上进行页面跳转到show页面上
@Controller
@RequestMapping("/product")
public class ProductController {
@RequestMapping("/add")
public ModelAndView add(Product product) throws Exception {
ModelAndView mav = new ModelAndView("showProduct");
return mav;
}
}
5.启动Tomcat,可以出现主页如下:
输入信息,点击增加商品
跳转如下
6.从上图可以发现几组对应关系
①首先是webapp文件夹下面的addProduct.jsp,对应与web.xml中设置的主页http://localhost:8080/addProduct.jsp,此时在启动后会自动跳转到此jsp界面,然后要求输入信息。web.xml文件是优先加载,文件里的配置是顺序加载。所以,DispatcherServlet是在主页加载之后才会加载。
②输入信息后,由form action=/product/add ,其去controller中自动找product注解标签下的add注解标签,也就是ProductController中的@RequestMapping("/add")
③找到之后,就进入下面的方法,此时,表单数据已经装载成一个Product实例,作为参数传入相应方法。然后方法是返回一个showProduct,则进入WEB-INF/views/showProduct.jsp页面,将之前存起来的product对象调出来,将其name和price显示出来到页面上,但是此时url仍然是http://localhost:8080/product/add?name=ipad&price=1500
此url和showProduct.jsp无关,只和之前的注解有关
④如果我直接在url上输入localhost:8080/product/add,则会跳转到showProduct页面上,但是因为没有在之前输入数据所以是默认数据null和0.0
此时若直接在后面输入?name=ipad&price=1500。也可以跳转到上面的界面
所以虽然显示的页面是showProduct.jsp,但是事实上这是由于url被拦截之后,根据product\add标签调用了其下面的方法返回的showProduct.jsp,所以url里面就还是/add而不是showProduct.jsp了。
此处除了主页,其他所有路径都会被拦截器拦截,所以访问某个页面必须由控制器控制跳转,无法直接访问。即使是静态资源,也需要相应的控制器。
这个要注意区分,即带后缀jsp的页面要显示,可以使用路径/xx.jsp来跳转,如果没有jsp,则系统会去controller中找这个url对应的标签,执行方法返回页面。(是否可以在url里输jsp文件绝对路径访问???)
就像之前的输入http://localhost:8080/home/index,执行了index标签下的方法,返回了index.jsp页面
7.总结对应关系如下
action——@Request——url
web.xml设置的首页——webapp下此首页的名字.jsp
return——views文件夹下对应的return的名字.jsp
二、客户端跳转
服务器跳转就是指服务器上的url并未改变,而页面发生跳转,
而客户端跳转则是其url也发生了跳转
//客户端跳转
@RequestMapping("/jump")
public ModelAndView jump() {
ModelAndView mav = new ModelAndView("redirect:/Test/hello");
//redirect就是指客户端跳转,注意这里是/home/index才会跳转到指定页面,否则只有/index就是404错误了
return mav;
}
此时在浏览器上输入http://localhost:8080/Test/jump会自动跳转到http://localhost:8080Test/index,其实就是利用jump标签里面的方法使得其再次跳转到index标签下面,进入index下面的方法里返回了index.jsp页面。
三、利用session记录访问次数
HomeController
@RequestMapping("/check")
public ModelAndView check(HttpSession session) {
//取出session中的count属性赋值给i
Integer i = (Integer) session.getAttribute("count");
//如果之前的count为Null则将其变为0再加1,若不是0则直接自增
if (i == null)
i = 0;
i++;
//将count属性值赋为i
session.setAttribute("count", i);
//转到check.jsp,在check.jsp中将count取出来显示出来
ModelAndView mav = new ModelAndView("check");
return mav;
}
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
session中记录的访问次数:${count}
此时在url中输入http://localhost:8080/home/check,就会显示1,每次刷新加1,如下
此demo就是将访问次数记录在session中,而且中间切换到其他页面再回来时,依然可以继续统计而不会计数器归零
四、上传文件功能
1.设置web.xml使其可以接收jpg文件,spring-mvc.xml中也需要设置支持文件上传,之前设置过了
<!--设置使其可以访问jpg文件格式-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
2.建立首页的接收图片的upload.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
<%--post指上传文件为明文,enctype是上传文件必须的--%>
<form action="/upload/uploadImage" method="post" enctype="multipart/form-data">
<%--file和前面text一样都是上传的格式,此处file则代表上传的是文件--%>
<%--image为文件名称,accept代表只接受图片上传--%>
选择图片:<input type="file" name="image" accept="image/*" /> <br>
<%--submit为一个按钮,上面文字为上传,按下去就执行上面的action,去controller中找对应标签--%>
<input type="submit" value="上传">
</form>
此时可以选择将Tomcat启动首页设置为http://localhost:8080/upload.jsp
建立pojo类UploadedImageFile封装MultipartFile类型的字段 image ,用于接受页面的注入,这里的image与上面的image对应
//封装MultipartFile类型的字段File,用于接受页面的注入
public class UploadedImageFile {
//与上传页面upload.jsp中的image对应
MultipartFile image;
public MultipartFile getImage() {
return image;
}
public void setImage(MultipartFile image) {
this.image = image;
}
}
4.建立UploadController上传控制器
@Controller
@RequestMapping("/upload")
public class UploadController {
//对应于upload.jsp中的action
@RequestMapping("/uploadImage")
//方法的第二个参数 UploadedImageFile中已经注入好了image
public ModelAndView upload(HttpServletRequest request, UploadedImageFile file)
throws IllegalStateException, IOException {
//防止重名文件覆盖所以采用随机名称
String name = RandomStringUtils.randomAlphanumeric(10);
//文件名尾缀设为.jpg
String newFileName = name + ".jpg";
//获取image目录用于存放上传的文件
File newFile = new File(request.getServletContext().getRealPath("/image"), newFileName);
//在父路径下新建文件夹,实际操作下来好像并没有新建
newFile.getParentFile().mkdirs();
//复制文件
file.getImage().transferTo(newFile);
//输出绝对路径位置方便查看:F:\java\IdeaProjects\maven-springmvc01\target\maven-springmvc01\image
System.out.println(request.getServletContext().getRealPath("/image"));
ModelAndView mav = new ModelAndView("showUploadedFile");
mav.addObject("imageName", newFileName);
return mav;
}
}
5.建立图片展示页面showUploadedFile.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%--src表示图片地址,下面的路径前面的/不能少。否则显示不出图片--%>
<img src="/image/${imageName}"/>
6.运行,下面输出图片存储路径为F:\java\IdeaProjects\maven-springmvc01\target\maven-springmvc01\image
选择输入图片,点击上传后,如下
而在文件存放位置也有上传的文件
明天的计划:
1、复习一下昨天demo的流程
2、.整合ssm,争取可以做到在页面上查询数据
3、.实现分页功能
4、.尽量实现其他CURD功能
遇到的困难:这次发现,这块的知识点的确有点细碎。实现一些方式的流程有很多种。关于spring mvc的运行流程,现在仅仅是有点感受了。
今日收获:加深了对spring mvc运行的理解。
评论