发表于: 2017-11-08 21:27:53
1 731
一.今日完成
1.看到师兄日报,对maven打包做了配置,一个带有main方法的类信息不会添加到manifest中(打开jar文件中的META-INF/MANIFEST.MF文件,将无法看到Main-Class一行)。为了生成可执行的jar文件,需要借助maven-shade-plugin,配置该插件如下:
<plugin>
<groupld> org. Apache. Maven. plugins </groupld>
<artifactld> maven-shade-plugin </artifactld>
<version>1. 2. 1 </version>
<executions>
<execution>
<phase >package </phase>
<goals>
<goal> shade </goa1>
</goals>
<configuration >
<transformers >
<transforrner implementat ion ="org. Apache. Maven. plugins. shade. Resource.
ManifestResourceTransformer">
<mainc1ass ><!--类路径--></mainc1ass >
</transformer >
</transformers>
</configuration>
</execution>
</executions>
</plugin>
执行mvn clean install,构建完成之后打开target/目录,可以找到带有main方法的类的jar包.
2.学习Spring MVC如何处理模型数据
将模型数据暴露给视图是Spring Mvc框架的一项重要工作。Spring MVC提供了多种途径输出模型数据,如下。
◆ModeaAndview:当处理方法返回值类型为ModelAndview时,方法体即可通过该对象添加模型数据,
◆@ModelAttributei在方法入参标注该注解后,入参的对象就会放到数据模型中
◆Man及Model:如果方法入参为org.Springfamework.ui.Model、org.Springfamework.ui.ModelMap或java.util.Map,则当处理方法返回时,Map中的数据会自动添加到模型中。
◆@sessionAttributes:将模型中的某个属性暂存到Httpsession中,以便多个请求之间可以共享这个属性。
1) ModelAndview
控制器处理方法的返回值如果为ModelAndview,则其既包含视图信息,又包含模型数据信息,这样Spring MVC就可以使用视图对模型数据进行渲染了。可以简单地将模型数据看成一个Map<String,Object>对象。
在处理方法的方法体中,可以使用如下方法添加模型数据:
◆ ModelAndview addObject(String attributeName, Object attribulevalue)
◆ModelAndview addAllObjects(Map<String,?> modelMap) ·
可以通过如下方法设置视图。
◆void setView(View view)指定一个具体的视图对象。
◆void setvViewName(StriRg viewName)指定一个逻辑视图名。
2) @ModelAttrlbute
如果希望将方法入参对象添加到模型中,则仅需在相应入参前使用@ModelAttrlbute注解即可。
@RequestMapping(value = "/handle61")
public String handle61(@ModelAttribute("user") User user) {
user.setUserId("1000");
return "/user/createSuccess";
}
Spring MVC将请求消息绑定到User对象中,然后再以user为键将User对象放到模型中。在准备对视图进行渲染前,Spring MVC还会进一步将模型中的数据转储到视图的上下文中并暴露给视图对象。对于JSP视图来说,Spring MVC会将模型数据转储到ServletRequest的属性列表中(通过ServletReques#setAttribute(String name,Object o)方法保存)。
handle61o方法返回的逻辑视图名为/user/createsucccss,对应createsuccess.jsp视图对象,这样createsuccess,Jsp就可以使用S{user.userNamej等方式顺利地访问到模型中的数据了
除了可以在方法入参上使用@ModelAttrlbute注解外,还可以在方法定义中使用@ModelAttrlbute注解。Spnng MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttrlbute注解的方法,并将这些方法的返回值添加到模型中。
@ModelAttribute("user")
public User getUser() {
User user = new User();
user.setUserId("1001");
user.setUserName("<>");
return user;}
@RequestMapping(value = "/handle62")
public String handle62(@ModelAttribute("user") User user) {
user.setUserName("tom");
return "/user/showUser";
}
在访问UserControuer中的任何一个请求处理方法前,都会事先执行标注了@ModelAnribute的getUser()方法并将其返回值以user为键添加到模型中。
由于handle62()方法使用了入参级的@ModelAnribute注解,且属性名和方法级@ModelAnribute属性名相同,这时SpringMVC会把获取的模型属性先赋值给入参user,然后根据HTTP请求消息对user进行填充覆盖。得到一个整合后的user对象.
3)Map 及 Model
Spring MVC在内部使用一个ong.springframework.ui.Model接口存储模型数据,它的功能类似于java.util.Map,但它比Map易用ong.springframework.ui.ModelMap实现Map接口,而ong.springframework.ui.ExlendedModelMap扩展于ModelMap的同时实现了Model接口。
Spring MVC在调用方法前会创建一个隐含的模型对象,作为模型数据的存储容器,称之为"隐含模型"如果处理方法的入多为Map或Model类型,则sprtgg MVC会将隐含模型的引用传递给这些入参。在方法体内,开发者可以通过这个入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。
@ModelAttribute("user")
public User getUser() {
User user = new User();
user.setUserId("1001");
user.setUserName("<>");
return user;}
@RequestMapping(value = "/handle63")
public String handle63(ModelMap modelMap) {
User user = (User) modelMap.get("user");
user.setUserName("tom");
modelMap.addAttribute("testAttr", "value1");
return "/user/showUser";
}
Spring MVC一旦发现处理方法有Map或Model类型的入参,就会将请求内在的隐含模型对象传递给这些参数,因此在方法体中可以通过这个入参对模型中的数据进行读/写操作。
4)@SessionAttributes
如果希望在多个请求之间共用某个模型属性数据,则可以在控制器类中标注@SessionAttributes,Spring MVC会将模型中对应的属性暂存到Httpsession中。
@Controller
@RequestMapping("/user")
@SessionAttributes(value={"user","user1","user2"},types={Dept.class})
public class UserController {
@RequestMapping(value = "/handle71")
public String handle71(@ModelAttribute("user") User user) {
user.setUserName("John");
return "redirect:handle72.html";
}
@RequestMapping(value = "/handle72")
public String handle72(ModelMap modelMap, SessionStatus sessionStatus) {
User user = (User) modelMap.get("user");
if (user != null) {
user.setUserName("Jetty");
sessionStatus.setComplete();
}
return "/user/showUser";
}
标注的@SessionAtlributes("user")会自动将本处理器中任何处理方法属性名为user的模型属性透明地存储到Httpsession中。handle71()方法的User user入参会添加到隐含模型中,于是这个模型属性在handle?lo方法执行时,会由SpringMVC将其透明地保存到Httpsession中。
二.明日计划
分离web和service组件,在本地调试Spring RMI
三.遇到问题
今天补充了基础知识,任务进度有所滞后.
四.收获
以上.
进度:原计划今天完成任务8,但是根据目前情况需要延期一天提交.
评论