Spring Web MVC注解应用
a.RequestMappingHanlderMapping组件
@RequestMapping(“/login..do”)
该标签用在Controller业务方法前
b.Controller编写和配置
取消了实现Controller接口及方法的约定
可以允许我们按需要灵活定义业务方法
public ModelAndView或者String 方法名(根据需要定义 request,response,session){}
(Controller需要扫描到Spring容器,必须使用@Controller)
还是写例子 hello.jsp
处理流程是一样的
Spring配置文件:
<!-- 等价于handlermapping和handleradapter两个bean。其实还有其他的 -->
<!-- 开启扫描controller -->
<context:component-scan base-package="Controller"></context:component-scan>
<!-- 配置viewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
web.xml
<servlet>
<servlet-name>springwebmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指明配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!-- <load-on-startup>1</load-on-startup> -->
</servlet>
<servlet-mapping>
<servlet-name>springwebmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
Controller:
package Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller//扫描到Spring容器
public class toLogonController {
@RequestMapping("logon.do")
public ModelAndView execute(){
ModelAndView mav = new ModelAndView("hello");
return mav;
}
}
hello.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>Spring MVC example</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<h1>Spring Web MVC 注解版</h1>
</body>
</html>
再写下登陆
//进入登陆页面
/tologin.do
DispatcherServlet
Handlermapping
LoginController
ViewResolver
login.jsp
login.do
DispatcherServlet
Handlermapping
LoginController
ViewResolver
正确jsp 错误jsp
主要是Controller
可以把多个控制写在一个里面不同的就是请求路径
package Controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller//扫描到Spring容器
public class toLogonController {
@RequestMapping("tologin.do")
public ModelAndView execute(){
ModelAndView mav = new ModelAndView("login");
return mav;
}
@RequestMapping("login.do")
public String checkLogin(HttpServletRequest request){
String username=request.getParameter("username");
String password=request.getParameter("password");
if(username.equals("root")&&password.equals("1234")){
return "hello";
}else
return "login";
}
}
1.Controller如何接收请求参数
a.利用HttpServletRequest
b.利用业务方法参数
参数名与请求参数key保持一致
请求: login.do?username=xxx
Controller中:
public String f1(String username){}
或者利用@RequetParam(“key”)
public checkLogin1( @RequetParam(“key”) String username
){
}
然后这个username就有值了。
注意:这个@RequetParam(“key”)是在方法参数中写在参数前面的
c.利用实体对象参数
//使用实体对象user接收请求参数
public String checkLogin2(User user){
//利用 user来接收参数并获取。
}
然后创建一个entity包写入类 User
public class User implements Serializable(){
//最好写上接口 Serializable 方便以后序列化
private String username;
private String password;
加上set get方法
}
少量参数使用b;利用方法参数名保持一致。大量参数使用c;如果客户端表单数据没有格式检查,遇到非字符串使用a;
2.Controller如何向响应jsp传值
a.利用HttpServletRequest(setAttribute方法)
b.利用ModelAndView 返回一个ModelAndView对象利用
mav.getModel().put()方法
其实这个Model是个map
c.利用ModelMap方法参数
@RequestMapping(“login3.do”)
public String checkLogin3( String username String password ModelMap model){
//传给jsp值
//增加一个参数 ModelMap
model.put(“username”,username);
//在jsp中用el表达式获取 ${username}
}
d.使用@ModelAttribute(“key”)
一个是get方法前面,一个方法参数前面
public String checkLogin4(@ModelAttribute(“user”)String username ){}
这么写就直接会帮你传过去。获取就是${user}
但只能把参数值传过去。
或者
@ModelAttribute(“user”)
public String getName(){
return “tom”
}
等价于
model.put(“user”,getName()); //${user}
主要用a和c
3.Controller如何使用session
public String checkLogin(HttpSession session){
session.setAttribute(key,value);
}
然后在jsp中获取session内容还是用el表达式
${sessionScope.username}
案例:列表显示功能
/list.do
DispatcherServlet
HandlerMapping
ListController(List,传递到list.jsp)
ViewResolver
/WEB-INF/list.jsp
Controller:
package Controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import entity.User;
@Controller
public class ListController {
@RequestMapping("list.do")
public String listController(HttpServletRequest request){
List<User> list =new ArrayList<User>();
for(int i=0;i<5;i++){
User user = new User();
user.setUsername("admin"+i);
user.setPassword("password"+i);
list.add(user);
}
request.setAttribute("list", list);
return "list";
}
}
User:
package entity;
public class User {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
list.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>list</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<%@page import="entity.*" %>
<body>
<h1>list</h1>
<table>
<tr>
<td>id</td>
<td>username</td>
<td>password</td>
</tr>
<%
List<User> list = ( List<User>)request.getAttribute("list");
int i=0;
for(User user:list){
i++;
String username=user.getUsername();
String password=user.getPassword();
%>
<tr>
<td><%=i %></td>
<td><%=username %></td>
<td><%=password %></td>
</tr>
<%
}
%>
</table>
</body>
</html>
使用jstl标签:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>list</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<%@page import="entity.*" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<body>
<h1>list</h1>
<table>
<tr>
<td>id</td>
<td>username</td>
<td>password</td>
</tr>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.username}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
</body>
</html>