mvc框架的共有特徵:
架包的導入:
commons-logging-1.1.1.jar //日誌架包
spring-aop-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
一.請求分發,
(url 定位到 一個java類的方法!!)
二.表單參數如何獲取?
主動式?(servletAPI) 被動式?DI
三.跳轉到模板
四.
一.請求分發:(三種)
1.servlet的方式:
@Controller
@RequestMapping("/demo")
public class DemoServlet {
@RequestMapping(method=RequestMethod.GET)
public void doGet(HttpServletRequest res,HttpServletResponse es){
System.out.println("get...");
}
@RequestMapping(method=RequestMethod.POST)
public void doPostt(HttpServletRequest req,HttpServletResponse res){
System.out.println("post...");
}
}
//訪問方式:http://localhost:8080/springmvctest/demo.do
2.類似struts1的方式:
@Controller
@RequestMapping("/struts1")
public class StrutsController {
@RequestMapping(params="method=add")
public void findAll(){
System.out.println("add......");
}
@RequestMapping(params="method=findall")
public void findall(){
System.out.println("findall....");
}
}
//訪問方式:http://localhost:8080/springmvctest/struts1.do?method=add
3.類似與struts2的方式:(常用的)
@controller
@requestmapping("/user") (可以不用這個一樣可以定位到!!)
public class UserController{
@requestmapping("/add")
public void add(){
System.out.println("add......")
}
}
訪問方式:http://localhost:8080/springmvctest/user/add.do
4.springmvc在Controller的局部變量是用的一個變量,方法執行完了就被釋放,而struts2的成員變量是一個action(請求)new一個對象,
就算是調用的是同一個action
5.默認的controller是單例的,
二.表單參數的獲取:(一共三種獲取了參數的方式。)
6.1)用(DI方式,方法參數的注入。)
@RequestMapping("/user/login") //<DI方式 方法參數的動態注入!!>
public void login(@RequestParam("n")String uname,@RequestParam("p")String pwd){
System.out.println(uname+"....."+pwd);
}
訪問方式:http://localhost:8080/springmvctest/user/login.do?n=renchenhao&p=1234
/**
* required 該參數是否必須,默認爲true;
* defaultValue 請求參數的默認值;
* value值即請求參數的參數名;
* @return
*/
@RequestMapping(value="/testRequestParam")
public String testRequestParam(@RequestParam(value="username") String un
,@RequestParam(value="age",required = false,defaultValue="0") int ag){
System.out.println("username="+un+"age:"+ag);
return SUCCESS;
}
//http://localhost:8080/springmvctest/testRequestParam?username=renchen&age=11
6.2)模型驅動(一個java的類,用於參數的接受)
@RequestMapping("/user/add")
public void add(Uer uer){
System.out.println();
return SUCCESS;
}
//pojo類
//uer類
String username ;
String pwd;
Adress adress;
//省略get和set方法;
//adress類 //級聯
String city;
//省略get和set方法
<form action="testPojo">
<input type="text" name="username"/>
<input type="text" name="pwd"/>
<input type="text" name="adress.city"/>
<input type="submit" value="submit"/>
</form>
(說明:傳進來的值的屬性名與user的類裏面所聲明的成員變量相同的就自動賦值給它,)
6.3)restFULL方式 (http,uri的更加充分的利用)
@RequestMapping("/user/{id}/del")
public void del(@PathVariable("id") Integer id){//http 的restfull風格
System.out.println("..........add....del"+id);
}
7.解耦 模擬環境 自動化測試– >>
三.跳轉到模板:
怎麼傳遞參數,構建響應體!
9.struts2中用的是result
10.在springmvc中是: return "forward:/welcome.jsp";
(相對路徑,requestmapping的路徑)
@RequestMapping("/user/login") //DI方式 方法參數的動態注入!!
public String login(@RequestParam("n")String uname,
@RequestParam("p")String pwd,HttpServletRequest session){
System.out.println(uname+"....."+pwd);
session.setAttribute("uname", uname);
return "forward:/welcome.jsp"; // 這裏在forward:後面必須加一個/ 不然就會使用相對路
//徑,即把/user/addde之前的路徑附在之前作爲路徑。
}
11.1)ModelMap是map的實現,可以在其中存放屬性,作用域同request。通過
el表達式,jstl,java代碼均可。
11.2)爲了解耦,不推薦使用原生的HttpServletRequest而是使用ModelMap
12.有些面試官會問,你覺得struts2和springmvc框架的好處都是什麼啊?
可以和環境解耦,便於環境測試!!
13.1)springmvc關於跳轉(return "forward:/welcome.jsp"):簡化!!但是,在一些特殊場景中,反到帶來了不方便,
有些網站的設計人員,不想外部的人員直接訪問,把工程放在了WEB-INF底下,
那麼就得這樣寫(return "forward:/WEB-INF/welcome.jsp"),當網站較大時,這就帶來了一個弊端,需要重複寫
很多代碼,這時就有了:"視圖解析器(幫我們定位到某一個資源的)".
13.2)視圖解析器:(如果在return 中沒有家上 "forwward:" 那麼就會使用到視圖解析器)
在springmvc-servlet.xml中加上這樣一條語句:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/ren/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
14.重定向:返回值形如:return "redirect:http://www.baidu.com";
15.中文編碼filter:
在web.xml中加上這樣一條語句(這個控制亂碼方法的只對post的提交方式有用.):
<filter>
<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
相當於servlet中的:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
16.ModelAndView模型視圖類(和用ModelMap map相似):
見名知意,從名字上我們可以知道ModelAndView中的Model代表模型,View代表視圖。即,這個類
把要顯示的數據存儲到了Model屬性中,要跳轉的視圖信息存儲到了View屬性。我們來看下ModelA
ndView的部分源碼,即可知其中的關係:
@RequestMapping("/user/add") //DI方式 方法參數的動態注入!!
public ModelAndView login(@RequestParam("n")String uname,@RequestParam("p")String pwd){
System.out.println(uname+".../////.."+pwd);
ModelAndView mv= new ModelAndView();
mv.setViewName("hao/welcome");
mv.getModelMap().put("a", uname);
return mv; // 把返回參數改爲ModelAndView類型的
}
17.文件上傳(spring使用了apache-commons下的上傳組件,因此我們需要引入兩個jar包,學了maven後可以自動導):
導包:
1).Apache-commons-fileupload.jar(這兩個包可以在spring2.5.6中找到,或者在網上查找)
2).apache-commons-io.jar
----------------------------------------------
java文件代碼:
package com.bjsxt.controller;
import java.io.File;
import java.io.IOException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
@Controller
public class UploadCont {
@RequestMapping("/toupload")
public String toUpload(){
return "hao/upload";
}
@RequestMapping("/upload") //< !!!必須加上@RequestParam("file")!!!! >
public String upload(@RequestParam("file")CommonsMultipartFile file){
System.out.println(file.getOriginalFilename());
try {
file.transferTo(new File("D:/1.txt"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "ok";
}
}
spring-servlet.xml中的關於文件上傳的相關代碼:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize"><value>1203500</value></property> <!-- 最大文件大小(-1爲無限制) -->
<property name="defaultEncoding"><value>utf-8</value></property><!-- 默認編碼 -->
<property name="maxInMemorySize"><value>10240</value></property><!-- 最大內存大小 -->
</bean>
---------------------------------------------
jsp頁面代碼:
<!--method必須是post enctype必須是multipart/form-data-->
<form action="upload.do" method="post" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="file" name="file"/> <!-- 這裏的name屬性的名字爲file這個和java文件中的傳入的形參的名字要相同 -->
<input type="submit" />
</form>
----------------------------------------------
<注意:前後綴的問題>
18.1)
1)端對端模式(通俗點講讓瀏覽器專門處理瀏覽器js,html的,後臺專門處理數據)
2)jsp在後臺處理html,css,javascript(就是在後端處理前端的工作)
3).動態頁面技術的發生是我們需要一種模板 -- 實現java,html,js等
代碼複用(如jquery ui easyui)
AngularJs(不懂!)
18.2)
處理ajax請求(json):
手動的:
------------------------------------------
1.java代碼:
package com.bjsxt.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bjsxt.po.User;
@Controller
public class Ajax {
@RequestMapping(value="/byid",produces="text/html;charset=utf-8")
public @ResponseBody String findById(Integer id){
User user= new User();
user.setId(id);
user.setName("ilsf");
user.setPhone("123456");
//這裏可以使用json工具轉化爲字符串
return "{\"id\":1,\"name\":'小嘎',\"phone\":'adfsdf'}"; //手動轉換
}
}
2.注意:
需要在spring-servlet.xml加上這一句話(必須加):<mvc:annotation-driven></mvc:annotation-driven>
最後的配置如果沒有<mvc:annotation-driven/>,那麼所有的Controller可能就沒有解析,所有當有請求時
候都沒有匹配的處理請求類,就都去<mvc:default-servlet-handler/>即default servlet處理了。添加上
<mvc:annotation-driven/>後,相應的do請求被Controller處理,而靜態資源因爲沒有相應的Controller就
會被default servlet處理。總之沒有相應的Controller就會被default servlet處理就ok了。<(這句話有待考究!!)>
3.心得:
如果不加<mvc:annotation-driven/>那麼controller可能並沒有被解析,而是交給了<mvc:annotation-driven/>處理,
有一點可以說明買就是當你攔截了全部請求的時候,就會顯示404錯誤,這是如果加上<mvc:annotation-driven/>,錯誤就會消失。
//訪問方式:http://localhost:8080/springmvctest/byid.do?id=1
接受json格式的數據: