一、Spring MVC web框架
-----------------------------------------
二、搭建tomcat服务器
-----------------------------------------
1.下载并解压tomcat,注意解压路径下不要有中文或者空格
2.启动tomcat服务器
cmd tomcat/bin> startup.bat
3.验证服务器是否启动成功
http://localhost:8080/
三、tomcat的目录结构
---------------------------------------------
1.bin
2.conf //配置文件
3.webapps //项目部署目录--可以将项目打成war包扔进去,运行期间自行解压
4.work //临时目录
四、在idea中开发web项目的准备工作
---------------------------------------------
1.在idea中配置tomcat服务器
settings > applications server 右侧 +:指定tomcat安装位置
2.创建java模块 + javaEE支持 + maven支持.
3.配置运行选项
a.如果已经运行tomcat,请先停止
b.run --> edit configuration --> + --> tomcat server
c.Doployment --> + --> artifact --> *.war exploded
d.配置热更新 Server选项卡--> VM options部分
on "Update" action : update Classes and resources
on Frame deactivation : update Classes and resources
4.运行app
五、开发简单的web项目
-------------------------------------------
1.添加依赖:在pom.xml引入springmvc的依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.it18zhang</groupId>
<artifactId>myspringmvc</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
</dependencies>
</project>
2.配置分发器:在web/WEB-INF/web.xml文件中配置DispatcherServlet分发器.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置分发器Servlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3.配置handlermapping:配置springmvc驱动文件,使用注解驱动配置项(默认名称就是dispatcher-servlet.xml)
[web/WEB-INF/dispatcher-servlet.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd">
<!-- 使用注解驱动 -->
<mvc:annotation-driven />
</beans>
4.编写控制器类
[HomeController.java]
package com.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* HomeControllor
* @Controller 表示此类是控制器,scan时起作用
*/
@Controller
public class HomeController {
/**
* 打开主页
* @RequestMapping({"/home"})
* 处理以 /home 结尾的请求
*/
@RequestMapping({"/home"})
public String openHome()
{
System.out.println("open homepage");
return "index";
}
/**
* 打开index2页面
* @RequestMapping({"/index2"})
* 处理以 /index2 结尾的请求
*/
@RequestMapping({"/index2"})
public String openindex2()
{
System.out.println("open index2");
return "index2";
}
}
5.告知spring容器扫描注解:配置dispatcher-servlet.xml文件,增加扫描路径配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 配置扫描路径 -->
<context:component-scan base-package="com.spring.controller" />
<!-- 使用注解驱动 -->
<mvc:annotation-driven />
</beans>
6.添加类库到打包输出路径 -- 解决 运行程序的时候,出现类找不到的原因。
idea的web项目默认不会将依赖类库放置到web-inf/lib下,需要手动设置。
project structure -> artifacts -> myspringmvc:war exploded -> 选择 output layout选项卡 ->
选择右侧的available elements下myspringmvc条目的所有类库 ->右键 -> put into WEB-INF/lib即可。
7.启动程序,访问地址
http://localhost:8080/
8.配置Spring MVC是视图解析器.
[web/WEB-INF/dispatcher-servlet.xml]
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<!-- 配置扫描路径 -->
<context:component-scan base-package="com.it18zhang.springmvc.web.controller" />
<!-- 使用注解驱动 -->
<mvc:annotation-driven />
<!-- 内部资源视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix + controller return + suffix-->
<!-- 前缀 + 控制器返回值 + 后缀 -->
<!-- / index .jsp -->
<property name="prefix" value="/" />
<property name="suffix" value=".jsp"/>
</bean>
</beans>
9.启动程序,访问地址
http://localhost:8080/home/
http://localhost:8080/index2/
六、html
-----------------------------------------------------------
1.inline行内标签
标签自己不占一行,和其他标签共处一行。如果想换行,需要加<br>
2.block块标签
标签自己占用一行
七、web项目 -- 实现用户注册功能
----------------------------------------------------
1.在创建/web/下创建regist.jsp页面
[/web/regist.jsp]
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>regist.jsp</title>
</head>
<body>
<form>
UserName : <input type="text" name="username" ><br>
Password : <input type="password" name="password" ><br>
<input type="submit" name="submit">
</form>
</body>
</html>
2.添加maven依赖,引入Servlet API类库
[pom.xml]
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>groupId</groupId>
<artifactId>SpringMVC</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
</project>
3.给from添加超链接 -- 采用post的方式链接到@Controller 的 @Mapping "/doRegist2"
[/web/regist.jsp]
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>regist.jsp</title>
</head>
<body>
<!-- jsp页面给控制器传递参数 -->
<form action="/doRegist2" method="post" >
UserName : <input type="text" name="username" ><br>
Password : <input type="password" name="password" ><br>
<input type="submit" name="submit">
</form>
</body>
</html>
4.新建类RegistController.class -- 两种方式获取回传的用户名和密码
--------------------------------------------------------
package com.spring.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
@Controller
public class RegistControllor {
/**
* 打开注册页面
*/
@RequestMapping({"/regist"})
public String registPage()
{
return "regist";
}
/**
* 处理注册信息
*/
@RequestMapping({"/doRegist1"})
public String doRegist1(HttpServletRequest request)
{
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + ":" + password);
return "index";
}
/**
* 处理注册信息
*/
@RequestMapping({"/doRegist2"})
public String doRegist2(@RequestParam("username") String username, @RequestParam("password") String password)
{
System.out.println(username + "--" + password);
return "index";
}
}
八、动态获取上下文(根目录) Controller向jsp传递参数 -- 引入jstl标签库,jee标准标签库
--------------------------------------------------------------------
1.达到动态获取项目名称[上下文],然后作为参数传递给jsp,解决随意更改项目名称的问题
2.添加maven依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
3.修改jsp页面,声明标签库并使用标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>reg.jsp</title>
</head>
<body>
<!-- 动态提取标签的上下文 -->
<form action='<c:url value="/reg.jsp" />' method="post">
UserName : <input type="text" name="username"><br>
Password : <input type="password" name="password"><br>
<input type="submit"/>
</form>
</body>
</html>
九、模拟查询一个User对象 -- 控制器给jsp页面传递参数by Model
------------------------------------------------------------------
1.添加控制器方法
/**
* 模拟查询用户信息
* 通过model向jsp页面传值
*/
@RequestMapping("/selectOne")
public String selectOne(Model model, @RequestParam("uid") int uid)
{
System.out.println("uid = " + uid);
String username = "tomson";
model.addAttribute("myusername", username);
return "selectOne";
}
2.编写selectOne.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>selectOne.jsp</title>
</head>
<body>
username : <c:out value="${myusername}" />
</body>
</html>
3.运行,并打开浏览器,输入网址:http://localhost:8080/selectOne?uid=100
十、模拟查询user列表
----------------------------------------------------------------------
1.新建User类
-------------------------------
package com.spring.domain;
/**
* 用户java bean
*/
public class User {
private Integer id;
private String name;
private int age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.添加控制器方法
/**
* 查询全部
*/
@RequestMapping("/selectAll")
public String selectAll(Model model)
{
List<User> userList = new ArrayList<User>();
for (int i = 1; i <= 50 ; i++) {
User u = new User();
u.setId(i);
u.setAge(i % 20);
u.setName("tom" + i);
userList.add(u);
}
model.addAttribute("allUsers", userList);
return "userList";
}
3.创建userList.jsp界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>selectOne.jsp</title>
</head>
<body>
<table border="1px">
<tr>
<td>ID</td>
<td>NAME</td>
<td>AGE</td>
</tr>
<c:forEach items="${allUsers}" var="u">
<tr>
<td><c:out value="${u.id}"/>
<td><c:out value="${u.name}"/>
<td><c:out value="${u.age}"/>
</tr>
</c:forEach>
</table>
</body>
</html>
4.启动服务器,输入地址http://localhost:8080/selectAll
十一、forward 请求转发 -- 一个控制器转发请求到另一个控制器
---------------------------------------------------------------
1.请求转发,在服务器内部完成,客户端不参与。虽然内容改变,但是界面还是原来的界面,并没有跳转到新的界面
2.地址栏不改变,如果刷新界面,很可能导致重复提交。
3.只能转发到本应用的其他控制器映射上。
4.共享请求参数
十二、redirect 重定向 -- 一个控制器转发请求到另一个控制器,但是不带数据
-------------------------------------------------------------------
1.模拟服务器重新发送请求,打开新的界面,相当于完全打开了一个新的页面。跳转到了一个新的界面
2.重定向,客户端参与,地址栏变,可以重定向到任意url地址。
3.不能共享变量。
4.不会导致重复提交
十三、模拟完成数据库的CRUD
----------------------------------------------------------------
1.编写控制器
------------------------------------
package com.spring.controller;
import com.spring.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
@Controller
public class RegistControllor {
public static List<User> userList = new ArrayList<User>();
static {
for (int i = 1; i <= 50 ; i++) {
User u = new User();
u.setId(i);
u.setAge(i % 20);
u.setName("tom" + i);
userList.add(u);
}
}
/**
* 打开注册页面
*/
@RequestMapping({"/regist"})
public String registPage()
{
return "regist";
}
/**
* 处理注册信息
*/
@RequestMapping({"/doRegist1"})
public String doRegist1(HttpServletRequest request)
{
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username + ":" + password);
return "index";
}
/**
* 处理注册信息
*/
@RequestMapping({"/doRegist2"})
public String doRegist2(@RequestParam("username") String username, @RequestParam("password") String password)
{
System.out.println(username + "--" + password);
return "index";
}
/**
* 模拟查询用户信息
* 通过model向jsp页面传值
*/
@RequestMapping("/selectOne")
public String selectOne(Model model, @RequestParam("uid") int uid)
{
System.out.println("uid = " + uid);
String username = DB.select(uid).getName();
model.addAttribute("myusername", username);
return "selectOne";
}
/**
* 查询全部
*/
@RequestMapping("/selectAll")
public String selectAll(Model model)
{
model.addAttribute("allUsers", DB.findAll());
return "userList";
}
/**
* 删除一个用户
*/
@RequestMapping("/deleteOne")
public String deleteOne(@RequestParam("uid") int uid)
{
System.out.println("删除用户" + uid);
DB.delete(uid);
return "redirect:/selectAll";
}
@RequestMapping("/editOne")
public String editOne(Model model , @RequestParam("uid") int uid)
{
User u = DB.select(uid);
model.addAttribute("user", u);
return "editUser";
}
@RequestMapping("/updateOne")
public String updateOne(User user)
{
DB.update(user);
return "redirect:/selectAll";
}
}
2.模拟数据库类
--------------------------------------
package com.spring.controller;
import com.spring.domain.User;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DB {
public static Map<Integer,User> tables = new HashMap<Integer, User>();
static{
for(int i = 1 ; i <= 15 ; i ++){
User u = new User();
u.setId(i);
u.setName("tom" + i);
u.setAge(i % 20);
tables.put(i,u) ;
}
}
/**
*查询全部
*/
public static List<User> findAll(){
return new ArrayList<User>(tables.values());
}
/**
* 删除
*/
public static void delete(Integer uid){
tables.remove(uid);
}
public static User select(Integer uid){
return tables.get(uid);
}
/**
* 更新
*/
public static void update(User user){
tables.put(user.getId(),user) ;
}
/**
* 删除全部
*/
public static void deleteAll(){
tables.clear();
}
}
3.编写index.jsp界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
欢迎xxxxxx!!!
<a href="<c:url value="/selectAll"></c:url>"> 查询全部用户信息 </a>
</body>
</html>
4.编写显示所有用户列表界面userList.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>selectOne.jsp</title>
</head>
<body>
<table border="1px">
<tr>
<td>ID</td>
<td>NAME</td>
<td>AGE</td>
<td>删除</td>
<td>修改</td>
</tr>
<c:forEach items="${allUsers}" var="u">
<tr>
<td><c:out value="${u.id}"/>
<td><c:out value="${u.name}"/>
<td><c:out value="${u.age}"/>
<td><a href="<c:url value="/deleteOne?uid=${u.id}"/>">删除</a></td>
<td><a href="<c:url value="/editOne?uid=${u.id}"/>">修改</a></td>
</tr>
</c:forEach>
</table>
</body>
</html>
5.编写更新用户界面editUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>editUser.jsp</title>
</head>
<body>
<form action='<c:url value="/updateOne" />' method="post">
id : <input type="hidden" name="id" value="<c:out value="${user.id}"/>"><br>
name : <input type="text" name="name" value="<c:out value="${user.name}"/>"><br>
age : <input type="text" name="age" value="<c:out value="${user.age}"/>"><br>
<input type="submit" value="修改"/>
</form>
</body>
</html>
6.运行app