springmvc框架的搭建

xiaoxiao2021-02-28  80

springmvc框架的搭建

目录

用 [TOC]来生成目录:

springmvc框架的搭建 目录 目录缩略图 需要的jar包webxml的配置mybatis-configxml文件的编写spring-mvcxml文件的编写spring-commenxml文件的编写 log4jproperties的编写indexjsp的编写controller的编写userjava的编写运行效果图谢谢各位

目录缩略图

项目结构图

需要的jar包

web.xml的配置

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Springmvc_1</display-name> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:config/spring-*.xml</param-value> </context-param> <!-- 乱码 <filter> <filter-name>CharacterEncoding</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 乱码 --> <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-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>web/index.jsp</welcome-file> </welcome-file-list> </web-app>

mybatis-config.xml文件的编写

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 实体类,简称 -设置别名 <typeAliases> <typeAlias alias="Contact" type="com.tyzd.pact.model.Contact" /> </typeAliases>--> <typeAliases> <!--批量扫描配置别名,别名就是类名--> <package name="com.test.cn.entity"/> </typeAliases> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 4.0.0以后版本可以不设置该参数 --> <property name="dialect" value="mysql"/> <!-- 该参数默认为false --> <!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 --> <!-- 和startPage中的pageNum效果一样--> <property name="offsetAsPageNum" value="true"/> <!-- 该参数默认为false --> <!-- 设置为true时,使用RowBounds分页会进行count查询 --> <property name="rowBoundsWithCount" value="true"/> <!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 --> <!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)--> <property name="pageSizeZero" value="true"/> <!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 --> <!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 --> <!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 --> <property name="reasonable" value="true"/> <!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 --> <!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 --> <!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 --> <!-- 不理解该含义的前提下,不要随便复制该配置 --> <!-- <property name="params" value="pageNum=start;pageSize=limit;"/> --> <!-- 支持通过Mapper接口参数来传递分页参数 --> <property name="supportMethodsArguments" value="true"/> <!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page --> <property name="returnPageInfo" value="check"/> </plugin> </plugins> <!-- 实体接口映射资源 --> <!-- 说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml <mappers> <mapper resource="com/tyzd/pact/mapper/ContactMapper.xml" /> </mappers>--> <!--批量加载mapper,这里的mapper.java必须和mapper.xml名称相同--> <mappers> <package name="com.test.cn.mapper"/> </mappers> </configuration>

spring-mvc.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:context="http://www.springframework.org/schema/context" 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/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd"> <!-- 注解扫描包 --> <context:component-scan base-package="com.test.cn" /> <!-- 开启注解 --> <mvc:annotation-driven /> <!-- 配置静态资源,直接映射到对应的文件夹,不被DispatcherServlet处理,3.04新增功能,需要重新设置spring-mvc-3.0.xsd --> <!-- 定义跳转的文件的前后缀 ,视图模式配置--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 --> <property name="prefix" value="/web/" /> <property name="suffix" value=".jsp" /> </bean> <!-- 上传文件拦截,设置最大上传文件大小 10M=10*1024*1024(B)=10485760 bytes --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8"/> <property name="maxUploadSize" value="10485760" /> </bean> <!-- SpringMVC在超出上传文件限制时,会抛出org.springframework.web.multipart.MaxUploadSizeExceededException 该异常是SpringMVC在检查上传的文件信息时抛出来的,而且此时还没有进入到Controller方法中 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!-- 遇到MaxUploadSizeExceededException异常时,自动跳转到/WEB-INF/jsp/error_fileupload.jsp页面 --> <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error_fileupload</prop> </props> </property> </bean> </beans>

spring-commen.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"> <!-- 1. 数据源 : DriverManagerDataSource <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="你的数据库url" /> <property name="username" value="root" /> <property name="password" value="root" /> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test"/> <property name="username" value="root"/> <property name="password" value="root"/> --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="你的数据库url"/> <property name="username" value="test"/> <property name="password" value="test"/> </bean> <!-- 2. mybatis的SqlSession的工厂: SqlSessionFactoryBean dataSource:引用数据源 MyBatis定义数据源,同意加载配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:config/mybatis-config.xml" /> </bean> <!-- 3. mybatis自动扫描加载Sql映射文件/接口 : MapperScannerConfigurer sqlSessionFactory basePackage:指定sql映射文件/接口所在的包(自动扫描) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.test.cn.mapper"></property> <property name="sqlSessionFactory" ref="sqlSessionFactory"></property> </bean> <!-- 4. 事务管理 : DataSourceTransactionManager dataSource:引用上面定义的数据源 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 5. 使用声明式事务 transaction-manager:引用上面定义的事务管理器 --> <tx:annotation-driven transaction-manager="txManager" /> </beans>

log4j.properties的编写

### set log levels ### log4j.rootLogger = info , Console , D #Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n log4j.logger.java.sql.ResultSet=INFO log4j.logger.org.apache=INFO log4j.logger.java.sql.Connection=INFO log4j.logger.java.sql.Statement=INFO log4j.logger.java.sql.PreparedStatement=INFO #output2file log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D:/logs/log.log log4j.appender.D.Append = true log4j.appender.D.Threshold = INFO ## 输出info级别以上的日志 log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

index.jsp的编写

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Index</title> </head> <script src="http://cdn.static.runoob.com/libs/jquery/1.10.2/jquery.min.js"></script> <%-- <script src="<%=basePath%>js/jquery.flexslider-min.js" type="text/javascript"></script> <script src="<%=basePath%>js/jquery.waypoints.min.js" type="text/javascript"></script> <script src="<%=basePath%>js/jquery-1.8.3.min.js" type="text/javascript"></script> <script src="<%=basePath%>js/jquery.easing.1.3.js" type="text/javascript"></script> <script src="<%=basePath%>js/jquery.SuperSlide.2.1.1.js" type="text/javascript"></script> --%> <body> <!-- <input onkeyup="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}" onafterpaste="if(this.value.length==1){this.value=this.value.replace(/[^1-9]/g,'')}else{this.value=this.value.replace(/\D/g,'')}"> --> <form class="aaa" action="<%=request.getContextPath()%>/user/add" method="POST" enctype="multipart/form-data"> username: <input type="text" name="username" /><br /> nickname: <input type="text" name="nickname" /><br /> password: <input type="password" name="password" /><br /> yourmail: <input type="text" name="email" /><br /> yourfile: <input type="file" name="myfiles" /><br /> yourfile: <input type="file" name="myfiles" /><br /> yourfile: <input type="file" name="myfiles" /> <br /> <input type="submit" value="添加新用户" /> </form> <input class="send_callback" type="button" value="发送ajax并返回" /> </body> <script type="text/javascript"> $('.send_callback').click(function(){ alert(123456); $.post('<%=basePath%>user/ajaxTest', { name : "张三", url : "www.baidu.com" }, function(data,status) { alert("数据: \n" + data + "\n状态: " + status); }); var a=[]; var data1={username:"test",nickname:"123456",email:"123@qq.com",password:"gz"}; var data2={username:"test1",nickname:"67890",email:"123@qq.com1",password:"gz1"}; a.push(data1); a.push(data2); $.ajax({ async:false, type:"POST", url:'<%=basePath%>user/ajaxTest1', dataType:"json", contentType:"application/json", data:JSON.stringify(a), success:function(data){ alert("数据: \n" + data); } }); }); </script> </html>

controller的编写

package com.test.cn.controller; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.commons.io.FileUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import com.test.cn.entity.User; @Controller @RequestMapping("/user") public class UserController { private final static Map<String, User> users = new HashMap<String, User>(); // 模拟数据源,构造初始数据 public UserController() { users.put("张起灵", new User("张起灵", "闷油瓶", "02200059", "menyouping@yeah.net")); users.put("李寻欢", new User("李寻欢", "李探花", "08866659", "lixunhuan@gulong.cn")); users.put("拓拔野", new User("拓拔野", "搜神记", "05577759", "tuobaye@manhuang.cc")); users.put("孙悟空", new User("孙悟空", "美猴王", "03311159", "sunhouzi@xiyouji.zh")); } @RequestMapping("/list") public String list(Model model) { model.addAttribute("users", users); return "list"; } @RequestMapping(value = "/add", method = RequestMethod.GET) public String addUser() { return "index"; } @RequestMapping(value = "/add", method = RequestMethod.POST) public String addUser(User user, @RequestParam MultipartFile[] myfiles, HttpServletRequest request) throws IOException { // 如果只是上传一个文件,则只需要MultipartFile类型接收文件即可,而且无需显式指定@RequestParam注解 // 如果想上传多个文件,那么这里就要用MultipartFile[]类型来接收文件,并且还要指定@RequestParam注解 // 并且上传多个文件时,前台表单中的所有<input // type="file"/>的name都应该是myfiles,否则参数里的myfiles无法获取到所有上传的文件 for (MultipartFile myfile : myfiles) { if (myfile.isEmpty()) { System.out.println("文件未上传"); } else { System.out.println("文件长度: " + myfile.getSize()); System.out.println("文件类型: " + myfile.getContentType()); System.out.println("文件名称: " + myfile.getName()); System.out.println("文件原名: " + myfile.getOriginalFilename()); System.out.println("========================================"); // 如果用的是Tomcat服务器,则文件会上传到\\%TOMCAT_HOME%\\webapps\\YourWebProject\\WEB-INF\\upload\\文件夹中 String realPath = request.getSession().getServletContext() .getRealPath("/WEB-INF/upload"); // 这里不必处理IO流关闭的问题,因为FileUtils.copyInputStreamToFile()方法内部会自动把用到的IO流关掉 FileUtils.copyInputStreamToFile(myfile.getInputStream(), new File(realPath, myfile.getOriginalFilename())); } } users.put(user.getUsername(), user); return "redirect:/user/list"; } @RequestMapping("/download") public ResponseEntity<byte[]> download(String filename, File file, HttpServletRequest request) throws IOException { // String filename = "电子商务通讯录.xlsx"; // String realPath = request.getSession().getServletContext() // .getRealPath("/WEB-INF/upload/电子商务通讯录.xlsx"); // File file = new File(realPath); String dfilename = new String(filename.getBytes("gb2312"), "iso-8859-1"); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", dfilename); ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>( FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED); return entity; } @RequestMapping(value = "ajaxTest") @ResponseBody public List<String> ajaxTest(String name, String url) { System.out.println(name + "--" + url); List<String> list = new ArrayList<String>(); list.add(name); list.add(url); return list; } @RequestMapping(value = "ajaxTest1") @ResponseBody public List<String> ajaxTest1(@RequestBody List<User> users) { System.out.println("后台数据---------------------------"); System.out.println(users.get(0).getUsername()+"--"+users.get(0).getPassword()); ArrayList<String> list = new ArrayList<String>(); for (User u : users) { list.add(u.getUsername()); list.add(u.getPassword()); } return list; } }

user.java的编写

package com.test.cn.entity; public class User { private String username; private String nickname; private String password; private String email; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public User() { } public User(String username, String nickname, String password, String email) { this.username = username; this.nickname = nickname; this.password = password; this.email = email; } }

运行效果图

谢谢各位!!!!!!!

转载请注明原文地址: https://www.6miu.com/read-75660.html

最新回复(0)