springMVC簡介
是MVC框架,和Spring無縫連接。
第1講:環境搭建
環境搭建都是從web.xml開始。
核心控制器DispacherServlet
說明:web.xml文件中,配置一個核心的servlet
1.在這之前要先拷貝jar包spring-framework-3.2.0.RELEASE,每一個特定jar包有三個(jar,文檔,源碼),真正的mvc包是spring-webmvc包。
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置上就可以改變配置文件的讀取路徑-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:config/spring-servlet.xml</param-value>
</init-param>
<!--tomcat容器一啓動,servlet就初始化,攔截所有請求-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
框架有配置文件,springmvc框架就是springMVC-servlet.xml
springMVC-servlet.xml配置文件默認要放web-inf目錄下。代碼如下:
<beans xmlns="...>
<!--視圖解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--配controller-->
<bean name="/test1/helloworld" class="com.tgb.web.controller"></bean>
</beans>
import org.springframework.web.servlet.mvc.Controller;
public class HelloWorldController implements Controller{
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse res)throws Exception{
return new ModelAndView("/welcome");
}
}
再建立一個welcome.jsp在根目錄就可以做測試了。
啓動報錯,1.有可能是缺乏commons-logging.jar,
2.配置文件的名字錯了,應爲springMVC-servlet.xml
可以發請求測試了。localhost:8080/springMVC1/test1/helloworld
例子2:
public class HelloWorldController implements Controller{
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse res)throws Exception{
String hello = "1sh hello提高班";
return new ModelAndView("/welcome","result",hello);
}
}
頁面是:${result}
例子3:
public class HelloWorldController implements Controller{
public ModelAndView handleRequest(HttpServletRequest req,HttpServletResponse res)throws Exception{
Map<String,Object> map = new HashMap<>();
map.put("map1","提高班1");
map.put("map2","提高班2");
return new ModelAndView("/welcome","map",map);
}
}要引入jstl的jar包和standard.jar包
頁面是:
<c:forEach items="${map}" var="m">
${m.key} --> ${m.value}
</c:forEach>
例子4:一個Controller多個方法
public class MultiController extends MultiActionController{
public ModelAndView add(HttpServletRequest req,HttpServletResponse res){
return new ModelAndView("/multi","method","add");
}
public ModelAndView update(HttpServletRequest req,HttpServletResponse res){
return new ModelAndView("/multi","method","update");
}
}
要在spring-servlet.xml文件裏配置:
<!--參數解析器,跟請求有關,可決定請求到控制器後調哪個方法-->
<bean id="paramMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<property name="paramName" value="action">
</bean>
<!--配置寫好的controller-->
<bean name="/test1/multi" class="xxx.MultiController">
<property name="methodNameResolver">
<ref bean="paramMethodResolver"/>引用剛纔寫的
</property>
</bean>
可以發請求測試了。
localhost:8080/springMVC2/test1/multi?action=add
localhost:8080/springMVC2/test1/multi?action=update
如果報錯,可能是方法少了HttpServletRequest req,HttpServletResponse res
---------------------------------------------------------------------
圖片的訪問
1.在根目錄建文件夾img,並把圖片拷貝到這裏。
2.jsp頁面上:<img alt="圖片" src="../img/a.png">
例子5:
public class MultiController extends MultiActionController{
public ModelAndView img(HttpServletRequest req,HttpServletResponse res){
return new ModelAndView("/staticFile");
}
}
配置bean及配置靜態資源訪問(不攔截)
<mvc:resources location="/img/" mapping="/img/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<bean name="/test1/img" class="xxx.MultiController">
<property name="methodNameResolver">
<ref bean="paramMethodResolver"/>引用剛纔寫的方法解析器
</property>
</bean>
---------------------------------------------------------------------
使用註解方式的配置
springAnnotation-servlet.xml文件:
<!--包掃描-->
<context:component-scan base-package="com.tgb.web.controller.annotation"></context:component-scan>
<!--開啓註解需要這兩個bean-->
<bean class="org.springframework.web.servlet.mvc.AnnotationMethodHandlerAdapter"></bean>
<bean class="org.springframework.web.servlet.mvc.DefaultAnnotationHandlerMapping"></bean>
@Controller
public class UserController{
@RequestMapping(value="/user/addUser",method=RequestMethod.GET)
public ModelAndView addUser(){
String result = "this is addUser----";
return new ModelAndView("/annotation","result",result);
}
@RequestMapping(value="/user/delUser",method=RequestMethod.GET)
public ModelAndView delUser(){
String result = "this is delUser----";
return new ModelAndView("/annotation","result",result);
}
}
說明:按照上面的寫法,請求 項目名/user/addUser會跳到annotation.jsp頁面。
對於method=RequestMethod.GET或者POST,比較是嚴格的,不對應的請求是不會有效果的。
---------------------------------------------------------------------
註解的優化
1.開啓註解可以用<mvc:annotation-driven/>代替
2.當各個方法的請求url開頭部分都相同的時候,可以合併在類上加註解。
類上RequestMapping(value="/user2"),方法就可以寫RequestMapping(value="/addUser"),
相當 @RequestMapping(value="/user/addUser")
3.想把數據傳遞到頁面可以用request.setAttribute("result",result);[要在方法的參數列表上加HttpServletRequest request]
4.get或者post方式不區分,可把 method=RequestMethod.GET 刪掉
5.控制器返回值可以用字符串:return "/jquery";
前方式是:return new ModelAndView("/jquery","result",result);(返回頁面及傳參)
---------------------------------------------------------------------
參數傳遞
<script type="text/javascript" >
function addUser(){
var form = document.forms[0];//注意這裏是forms
form.action="/springMVC6/user/data/addUser";
form.method="get";
form.submit();
}
</script>
<form action="">
姓名:<input type="text" name="userName"/>
年齡:<input type="text" name="age"/>
<input type="button" value="添加" onclick="addUser()"/>
</form>
@Controller
@RequestMapping("/user/data")
public class DataController {
@RequestMapping("/addUser")
public String addUser(String userName,String age,HttpServletRequest request){
request.setAttribute("userName",userName);
request.setAttribute("age",age);
return "/userManager";
}
}
說明:參數跟表單的name屬性對應,就能接收到。
顯示頁面:
姓名是:${userName}
年齡是:${age}
說明:亂碼是常見的。解決方法:server.xml裏在<Connector connectionTimeout="20000"...>這行加上URIEncoding="UTF-8"
---------------第9講---------------
$(function(){
$("#add").click(function(){
var userName = $("#userName").attr("value");
var age = $("#age").attr("value");
var user = {userName:userName,age:age};
$.ajax({
url:"/springMVC6/user/data/addUserJson",
type:"get",
data:encodeURI(user),
success:function(data){
alert("userName-->"+data.userName);
},
});
});
});
@RequestMapping("/addUserJson")
public String addUserJson(User user,HttpServletRequest request){
request.setAttribute("userName",user.getUserName());
request.setAttribute("age",user.getAge());
return "/userManager";
}
圖片路徑的注意點:
當類的路徑配置是"/user/data"時,圖片路徑是../xxx的話,上一級目錄就是user,不會返回到項目的根目錄,
所以js引入路徑最好是寫src="/項目名/js/xxx"
---------------第10講---------------
@RequestMapping("/addUserJson")
public String addUserJson(User user,HttpServletRequest request){
String result = "{\"userName\":\""+user.getUserName()+"\",\"age\":\""+user.getAge()+"\"}";
PrintWriter = null;
response.setContentType=("application/json");
try{
out = response.getWriter();
out.write(result);
}catch(IOException e){
e.printStackTrace();
}
}
拿json數據後臺要out.write(),前臺用jQuery的success回調函數就能拿結果function(data){}
---------------第11講---------------
上傳文件解析器配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"/>
<property name="maxUploadSize" value="123412344"/>
<property name="maxInmemorySize" value="40960"/>
</bean>
<form name="userForm" action="" enctype="multipart/form-data">
選擇文件:<input type="file" name="file">
<input type="submit" value="上傳">
</form>
說明:上傳enctype屬性必須爲multipart/form-data
少了兩個上傳文件的jar包,要拷貝。
另外文件上傳<form ../>必須採用method="post"方式
---------------第12講:上傳文件---------------
說的那個接口的方法用name屬性的值
@RequestMapping("/upload2")
public void upload2(HttpServletRequest request,HttpServletResponse response){
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
if(multipartResolver.isMultipart(request)){
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);
Iterator<String> iter = multiRequest.getFileNames();
while(iter.hasNext()){
MultipartFile file = multiRequest.getFile((String)iter.next());
if(file != null){
String fileName = "demoUpload" + file.getOriginalFilename();
String path = "D:/" + fileName;
File localFile = new File(path);
file.transferTo(localFile);
file.getInputStream();
}
}
}
}
儘量不用springmvc配置上傳大小,在客戶端驗證,減少服務器壓力。
---------------第13講:與spring集成---------------
struts2和spring集成關鍵點:
1.struts.xml文件中,<struts>標籤裏,<constant name="struts.objectFactory" value="spring"></constant>
說明:如果不用spring管理bean,要寫包名+類名,有spring後寫bean的id即可。
2.
沒有聲音
---------------第14講:與spring集成2---------------
@Controller
public class SpringController{
@Resource(name="springManager")
private ISpring springManager;
@RequestMapping("/spring/get")
public String get(){
springManager.get();
return "/success";
}
}
---------------第15講:與spring上下文關係---------------
//spring的上下文
WebApplicationContext ac1 = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
//springMVC的上下文
WebApplicationContext ac2 = RequestContextUtils.getWebApplicationContext(request);
ISpring springManager = (ISpring)ac1.getBean("springManager");
在一個配置文件裏寫bean很臃腫,spring可以導入配置文件。
<import resource="classpath*:com/tgb/..."/>
---------------第16講:與hibernate簡單實例---------------
- hibernate五大對象
Configuration
sessionFactory
Session
Transaction
Query和criteria
<property name="configLocations">
<list>
<value>classpath*:com/tgb/.../hibernate.cfg.xml</value>
</list>
</property>
hibernate.cfg.xml裏是這樣:
<hibernate-configuration>
<session-factory>
<mapping class="com.tgb.web.controller.entity.User"/>
</session-factory>
</hibernate-configuration>
public class User{
@Id
@GeneratedValue(generator="system-uuid")
@GenericGenerator(name="system-uuid",strategy="uuid")
private String id;
}
---------------第18講:與hibernate簡單實例---------------
需配置事務bean:
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
說明:事務管理哪個sessionFactory,可在裏面指定
配置事務特性描述(策略):
<bean id="transactionBase" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
<property name="transactionManager" ref="transactionManager"></property>
<property name="" ref=""></property>
<property name="transactionAttributes">
<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
<prop key="get*">PROPAGATION_NEVER</prop>
</property>
</bean>
---------------第19講:整合簡單實踐---------------
public interface IUserDAO{
public void addUser(User user);
}
public class UserDAO implements IUserDAO{
public void addUser(User user){
}
}
另一教程
---------------------------------------------------------------------
核心原理
- 用戶發送請求給服務器。
- 服務器接收到請求。發現DispacherServlet可以處理,於是調用DispacherServlet。
- DispacherServlet內部,通過HandleMapping用於檢查一個url有沒有對應的控制器。如果有,則調用,沒則報404.
- 控制器開始執行。
- 控制器執行完畢後,如果返回字符串,則ViewResolver將字符串轉化成相應的視圖對象;
如果返回ModelAndView對象,該對象本身就包含了視圖對象信息。
即改成return new ModelAndView("index");
- DispacherServlet將執行視圖對象中的數據,輸出給服務器。
- 服務器將數據輸出給客戶端。
注意:ModelAndView是web.servlet.ModelAndView包的
HandlerMapping
BeanNameUrlHandlerMapping
ModelAndView
-- 常用註解
- @Controller
在類上面加 @Component和 @Controller是等價的,表明是控制器。
- @RequestMapping
形式一:在類前面定義,則將url和類綁定。具體調哪個方法呢?需要url裏邊攜帶一個參數,如:
@RequestMapping(params="method=reg")
形式二:在方法前面定義,則將url和類的方法綁定。
- @RequestParam
比如有這樣的一種情況,提交的表單的<input type="text" name="uname"/>,
但是控制器的方法是public String reg3(String name){},
用於加在方法參數的前面,當提交的參數的name屬性值跟參數不一致時,就可以加。
public String reg3( @RequestParam("uname") String name){//提交表單的name屬性值是uname
....
}
說明:加 @RequestParam("uname")的意思就是把表單的屬性值爲uname所提交的數值賦值給name這個參數。
- @SessionAttributes({"u","a"})
說明:在某方法裏如果想使用ModelMap,在方法的參數列表里加: ,ModelMap map 就可以(會自動注入);
如果想使用HttpServletRequest req,在方法的參數列表里加: ,HttpServletRequest req
從而req.getSession().setAttribute("x","xxx");
map.put("a","aaa");-->頁面上${RequestScope.a}
在類上加了這個註解後,key爲u和a也會在session裏存一份。
- @ModelAttribute
這個註解可以跟 @SessionAttributes配合在一起用。可以將ModelMap中屬性的值通過該註解自動賦給指定變量。
public String reg5( @ModelAttribute("u") String uname,ModelMap map){}
說明:這裏有個uname參數,uname我不需要表單給我參數,我直接把ModelMap裏的屬性key爲u的值直接給我賦過來。
請求轉發與重定向
轉發 return "forward:user.do?method=reg";不寫也是轉發
重定向 return "redirect:http://www.baidu.com";
modelAndView.setViewName("index");
User u = new User("jack");
modelAndView.addObject("uu",u);//較好用
return modelAndView;
頁面上${requestScope.uu.uname}
<!-- JSP 視圖解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/modules/" />
<property name="suffix" value=".jsp" />
<property name="order" value="3" />
</bean>
/IMPM/WebContent/modules/saleManagement/earlyWarningManagement/earlyWarningManageDetail.jsp
-----------------------------------------------------------------
要讓? @Autowired?起作用必須事先在?Spring?容器中聲明AutowiredAnnotationBeanPostProcessor?Bean
<!--?該?BeanPostProcessor?將自動起作用,對標註 @Autowired?的?Bean?進行自動注入?-->?
<bean?class="org.springframework.beans.factory.annotation.?????????AutowiredAnnotationBeanPostProcessor"/>
當不能確定Spring容器中一定擁有某個類的bean時,可以用 @Autowired(required?=?false),這等於告訴?Spring:在找不到匹配?Bean?時也不報錯
我們在?Spring?容器中配置了兩個類型爲?Office?類型的?Bean,當對?Boss?的?office?成員變量進行自動注入時,Spring?容器將無法確定到底要用哪一個?Bean,因此異常發生了。?Spring?允許我們通過?@Qualifier?註釋指定注入?Bean?的名稱,這樣歧義就消除
了
@Resource作用相當於 @Autowired, @Resource默認按byName自動注入。如果使用name屬性,則使用byName的自動注入策略;而使用type屬性時則使用byType自動注入策略。
要讓JSR-250的註釋生效,除了加這些註釋外,還需要在Spring容器中註冊一個負責處理這些註釋的BeanPostProcessor:
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
標註了 @PostConstruct的方法將在類實例化後調用,而標註了 @PreDestroy的方法將在類銷燬之前調用。
@Component 註解的類就相當於xml配置文件裏定義的bean。默認情況下通過 @Component定義的Bean都是singleton的,如果需要使用其它作用範圍的Bean,可通過 @Scope 來達到目標。
==================第二套====================
- mvc在b/s系統下的應用,c控制器,m模型(pojo,action,service,dao),v視圖
mvc是一個設計模式.
處理器映射器是幹嘛的,是根據url找到對應的處理器。
處理器適配器去執行Handler。
第一步:發起請求到前端控制器DispatcherServlet
第二步:前端控制器查找Handler(可根據xml配置、註解進行查找)
第三步:處理器映射器HandlerMapping向前端控制器返回Handler(其實返回一個執行鏈)
第四步:前端控制器調用處理器適配器去執行Handler
第五步:處理器適配器去執行Handler
第六步:Handler執行完成,給適配器返回ModelAndView
第七步:處理器適配器向前端控制器返回ModelAndView(框架底層對象)
第八步:前端控制器請求視圖解析器去進行視圖解析。
第九步:視圖解析器向前端控制器返回view
第十步:前端控制器進行視圖渲染(將模型數據填充到request域中)
第十一步:前端控制器向用戶響應結果
組件:
1.前端控制器DispatcherServlet
作用:接收請求,響應結果,相當於轉發器。
2.處理器映射器
作用:根據請求的url查找Handler。
3.處理器適配器
作用:按照特定的規則去執行Handler
注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler。
4.視圖解析器View resolver
作用:進行視圖解析,根據邏輯視圖名解析成真正的view
5.視圖view
view是一個接口,實現類支持不同的view類型(jsp,freemarker,pdf...)
- 配置前端控制器(web.xml文件)
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--指定加載位置(配置處理器映射器、適配器)
不配置contextConfigLocation,默認加載/WEB-INF/servlet名稱-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
接下來要在springmvc.xml裏配置 1.處理器映射器 2.處理器適配器 3.視圖解析器
注意:多個映射器可以並存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理。
<!--配置handler-->
<bean name="/queryItems.action" class="cn.itcast.ssm.controller.ItemsController1"/>
<!--處理器映射器(非註解)
將bean的name作爲url進行查找,需要在配置Handler時指定beanname(就是url)-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--處理器適配器(非註解)-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--視圖解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
這時java代碼是:
public class ItemsController implements Controller
request.setAttribute("itemsList",itemsList);
//視圖
request.getRequestDispatcher("/WEB-INF/jsp/items/itemsList.jsp").forward(request,response);
好處是可以響應json數據
===================分隔線===================
<!--另一個非註解的適配器-->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
<!--簡單url映射(非註解)-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/queryItems1.action">ItemsController1</prop>
<prop key="/queryItems2.action">ItemsController1</prop>
</props>
</property>
</bean>
注意點3.多個映射器可以並存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理。
非註解的處理器適配器
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
要求編寫的Handler實現Controller接口
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
要求編寫的Handler實現HttpRequestHandler接口。
映射器
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping註解映射器。
在spring3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping註解映射器。
適配器
在spring3.1之前使用org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter註解適配器。
在spring3.1之後使用org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter註解適配器。
public class ItemController implements Controller{
public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response) throws Exception{
//調用service
List<Items> itemsList = new ArrayList<Items>();
//填充靜態數據,模擬數據庫
Items items_1 = new Items();
items_1.setName("");
ModelAndView modelAndView = new ModelAndView();
//相當於request的setAttribute,在jsp頁面可取數據
modelAndView.addObject("itemsList",itemsList);
//指定視圖
modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
return modelAndView;
}
}
小結:
重點掌握註解的方式。
對標記有@Controller的類中標記有@RequestMapping的方法進行映射。
視圖解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
表現層 |
業務層 |-- spring將各層進行整合、事務控制。
持久層 |
第一步:整合dao層。
使用mapper的掃描器自動掃描mapper接口,在spring中進行註冊。
第二步:整合service層。
將service接口配置在spring配置文件中。
第三步:
所需要的jar包:
數據庫驅動
log4j包
數據庫連接池包
jstl包
spring
<sql id="query_items_where">
<if test="itemsCustom!=null">
<if test="itemsCustom.name!=null and itemsCustom!=''">
items.name LIKE '%${itemsCustom.name}%'
</if>
</if>
</sql>
<select id="findItemsList" parameterType="包名.ItemsQueryVo" resultType="ItemsCustom">
SELECT items.* FROM items
<where>
<include refid="query_items_where"></include>
</where>
</select >
/**商品包裝對象*/
public class ItemsQueryVo{
private Items items;//商品信息
private ItemsCustom itemsCustom;
}
/**商品信息的擴展*/
public class ItemsCustom extends Items {
//添加擴展屬性
}
public class Items{
這裏是自動生成的
}
接口
public interface ItemsMapperCustom{
public List<ItemsCustom> findItemsList(ItemsQueryVo itemsQueryVo)throws Exception;
}
21小節:
url映射
窄化請求路徑
限制請求,配置的是允許的類型。
24小節:
參數綁定默認支持的類型
HttpServletRequest
HttpServletResponse
HttpSession
Model/ModelMap model是接口,ModelMap是一個接口實現
簡單類型 Integer
pojo
自定義轉換器
跟struts2區別:
1.springmvc將url和controller方法映射,映射成功後springmvc生成一個Handler對象,對象中只包括了一個method,方法執行結束,形參數據銷燬。
2.springmvc可以進行單例開發,並建議使用單例開發,struts2通過類的成員變量接收參數,無法使用單例,只能使用多例。
3.struts2速度慢,在於使用struts標籤,建議使用jstl
springmvc第二天
複習
DispatcherServlet 前端控制器:接收request,進行response
接收到請求之後,需要調用一個組件HandlerMapping處理器映射器:根據url查找Handler。(xml配置或者註解)
HandlerAdapter處理器適配器:根據特定規則去執行Handler,編寫Handler時需要按照HandlerAdapter的要求去編寫。
Handler處理器(後端控制器):需要程序員去編寫,常用註解開發方式。
Handler處理器執行後結果 是ModelAndView(Adapter處理決定的),具體開發時Handler返回方法值類型包括:ModelAndView、
String(邏輯視圖名)、void(通過在Handler形參中添加request和response,類似servlet開發,可實現json數據輸出)
View resolver視圖解析器:根據邏輯視圖名生成真正的視圖
View視圖:jsp頁面,僅是數據展示,沒有業務邏輯。
自定義參數綁定
定義的Converter<源類型,目標類型>接口
注意:要轉換的目標類型一定和接收的pojo中的屬性類型一致。
將定義的Converter實現類注入到處理器適配器中。
學習內容
綁定List
進入批量修改頁面,批量修改的提交
使用List接收頁面提交的批量數據,要通過包裝類定義List<pojo>屬性。
綁定Map:同樣通過包裝類,頁面也是定義屬性名,info['name']
- validation校驗
@Size(min=1,max=30,message="{items.name.length.error}",groups={ValidGroup1.class}) 校驗組1
private String name;
@NotNull(message="{items.createtime.isNull}") 非空校驗
private Date createtime;
ValidationMessages.properties文件:
items.name.length.error=請輸入1到30個字符
items.createtime.isNull=請輸入生成日期
public String editItemsSubmit(Model model,@Validated(value={ValidGroup1.class}) ItemsCustom itemsCustom,BindingResult bindingResult)throws Exception{
if(bindingResult.hasErrors()){
//輸出錯誤信息
List<ObjectError> allErrors = bindingResult.getAllErrors();
for(ObjectError objectError:allErrors){
System.out.println(objectError.getDefaultMessage());
}
model.addAttribute("allErrors",allErrors);
}
}
頁面上:
<c:if test="${allErrors != null}">
<c:forEach items="${allErrors}" var ="error">
${error.defaultMessage}
</c:forEach>
</c:if>
- 分組校驗
校驗分組接口
public interface ValidGroup1{
}
public interface ValidGroup2{
}
- 數據回顯
@ModelAttribute("items") 可以指定pojo回顯到頁面在request中的key
- JSON交互
1.要求請求的是json串,所以在前端頁面中需要將請求內容轉成json,不方便。
2.請求key/value,輸出json,常用。