javaweb项目分享

今天给大家分享个Javaweb源码,基于ssh网上图书管理的项目。

首先是项目所需要的spring、Struts、hibernatejar包,该资源包上传在我的上传资源中,积分也不多,可以下载下。

下载地址是:https://mp.csdn.net/console/upDetailed

导包这个就不用多说了吧,相信大家都非常熟练啦

在一个就是数据库配置文件,我的是jdbc.properties文件。配置如下:

########################################
########     database configuration     #######
#######################################
##driver
jdbc.driver=com.mysql.jdbc.Driver
##url
jdbc.url=jdbc:mysql://localhost:3306/book
##username
jdbc.username=root
##password
jdbc.password=1234
########################################
########     c3p0 configuration     #######
#######################################
## initialPoolSize Default: 3
c3p0.initialPoolSize=3
##minPoolSize Default: 3
c3p0.minPoolSize=2
##maxPoolSize Default: 15
c3p0.maxPoolSize=10
##maxIdleTime(s), (<mysql 28800) Default: 0
c3p0.maxIdleTime=28000
##idleConnectionTestPeriod(s), (<mysql 28800) Default: 0
c3p0.idleConnectionTestPeriod=3600
########################################
########     hibernate configuration     #######
#######################################
##hibernate dialect
hibernate.dialect=org.hibernate.dialect.MySQLDialect
#hibernate.dialect=org.hibernate.dialect.SQLServerDialect
#hibernate.dialect=org.hibernate.dialect.OracleDialect
##show sql
hibernate.show_sql=true
##format sql
hibernate.format_sql=false
##connection use unicode
hibernate.connection.useUnicode=true
##connection encoding
hibernate.connection.characterEncoding=utf8

以上代码可以直接添加到你的数据库配置文件中。

同时log4j文件必不可少哦  log4j.properties

##FATAL, ERROR, WARN, INFO, DEBUG, TRACE
#log4j.rootLogger=WARN, stdout, file
log4j.rootLogger=ERROR, stdout

########################
####	ConsoleAppender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%date [%p] %l - %msg%n

########################
####	DailyRollingFileAppender
#log4j.appender.file=org.apache.log4j.DailyRollingFileAppender 
#log4j.appender.file.File=/logs/log4j.log 
#log4j.appender.file.Append=false 
#log4j.appender.file.layout=org.apache.log4j.PatternLayout 
#log4j.appender.file.layout.ConversionPattern=%date [%t] (%p) %l - %msg%n

########################
####	SMTPAppender
#log4j.appender.mail=org.apache.log4j.net.SMTPAppender
#log4j.appender.mail.Threshold=ERROR
#log4j.appender.mail.BufferSize=5
#log4j.appender.mail.SMTPHost=smtp.qq.com
#log4j.appender.mail.Subject=subject
#log4j.appender.MAIL.SMTPUsername=username
#log4j.appender.MAIL.SMTPPassword=passowrd
#log4j.appender.mail.To=to
#log4j.appender.mail.From=from
#log4j.appender.mail.layout=org.apache.log4j.PatternLayout
#log4j.appender.mail.layout.ConversionPattern=%date [%t] (%p) %l - %msg%n

#########################
####	package or class lever
#log4j.logger.org.springframework=INFO
#log4j.logger.org.springframework.web=WARN
#log4j.logger.org.springframework.core=WARN
#log4j.logger.org.springframework.beans=WARN
#log4j.logger.org.springframework.context=WARN

用法同上,复制粘贴简单快捷。

几个工具类也给大家奉上分页工具类PageUtil

package com.itbaizhan.util;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
/**
 * 分页工具类
 */
public class PageUtil {
	/**
	 * 获取分页工具
	 * @param total 总记录数
	 * @param page 当前页面
	 * @param size 每页数量
	 * @return
	 */
	public static String getPageTool(HttpServletRequest request, long total, int page, int size){
		if (total <= 0) {
			return null;
		}
		// 计算总页数
		int pages = (int) (total % size ==0 ? total/size : total /size + 1);
		pages = pages == 0 ? 1 : pages;
		// 请求地址
		String url = request.getRequestURL().toString();
		// 请求参数
		StringBuilder paramBuilder = new StringBuilder();
		Enumeration<String> params = request.getParameterNames();
		while (params.hasMoreElements()) {
			String param = params.nextElement();
			if(param.indexOf("page") > -1) {
				continue;
			}
			paramBuilder.append("&").append(param).append("=").append(request.getParameter(param));
		}
		
		// 分页字符串
		StringBuilder pageBuilder = new StringBuilder();
		pageBuilder.append("<div class='pagination'>");
		// 上一页
		if (page <= 1) { // 如果已经是第一页, 上一页按钮disabled
			pageBuilder.append("<span class='disabled'><<</span>");
		}else{
			pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page-1)
			.append(paramBuilder).append("'>").append("<<").append("</a>").append("</span>");
		}
		// 中间数字页码
		if (pages <= 7) { // 全部显示
			for (int i = 1; i <= pages; i++) {
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, i));
			}
		}else{ // 显示部分
			if (page<4 || page>pages-3) { // 1 2 3 ... pages-2 pages-1 pages
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 1));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 2));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 3));
				pageBuilder.append(" ... ");
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages-2));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages-1));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages));
			}else{	// 1 2 ... page-1 page page+1 ... pages-1 pages
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 1));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, 2));
				pageBuilder.append(" ... ");
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, page-1));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, page));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, page+1));
				pageBuilder.append(" ... ");
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages-1));
				pageBuilder.append(packPageItem(url, paramBuilder.toString(), page, pages));
			}
		}
		// 下一页
		if (page >= pages) { // 如果已经是最后一页, 上一页按钮disabled
			pageBuilder.append("<span class='disabled'>>></span>");
		}else{
			pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page+1)
			.append(paramBuilder).append("'>").append(">>").append("</a>").append("</span>");
		}
		pageBuilder.append("</div>");
		return pageBuilder.toString();
	}

	/**
	 * 封装分页项
	 * @param url
	 * @param params
	 * @param page
	 * @param i
	 * @return
	 */
	private static String packPageItem(String url, String params, int page, int i) {
		StringBuilder pageBuilder = new StringBuilder();
		if (i == page) {
			pageBuilder.append("<span class='current'>").append(i).append("</span>");
		}else{
			pageBuilder.append("<a href='").append(url).append("?").append("page=").append(i)
				.append(params).append("'>");pageBuilder.append(i).append("</a>");
		}
		return pageBuilder.toString();
	}
	/**
	 * 后台管理分页
	 * @param request
	 * @param total
	 * @param page
	 * @param size
	 * @return
	 */
	public static String getPageToolAdmin(HttpServletRequest request, long total, int page, int size) {
		if (total <= 0) {
			return null;
		}
		// 计算总页数
		int pages = (int) (total % size ==0 ? total/size : total /size + 1);
		pages = pages == 0 ? 1 : pages;
		// 请求地址
		String url = request.getRequestURL().toString();
		// 请求参数
		StringBuilder paramBuilder = new StringBuilder();
		Enumeration<String> params = request.getParameterNames();
		while (params.hasMoreElements()) {
			String param = params.nextElement();
			if(param.indexOf("page") > -1) {
				continue;
			}
			paramBuilder.append("&").append(param).append("=").append(request.getParameter(param));
		}
		
		// 分页字符串
		StringBuilder pageBuilder = new StringBuilder();
		pageBuilder.append("<div style='width:140px;float:right;'>");
		// 上一页
		if (page <= 1) { // 如果已经是第一页, 上一页按钮disabled
			pageBuilder.append("<span style='color:lightgray'>上一页</span>");
		}else{
			pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page-1)
			.append(paramBuilder).append("'>").append("上一页").append("</a>").append("</span>");
		}
		// 中间数字页码
		pageBuilder.append("[").append(page).append("/").append(pages).append("]");
		// 下一页
		if (page >= pages) { // 如果已经是最后一页, 上一页按钮disabled
			pageBuilder.append("<span style='color:lightgray'>下一页</span>");
		}else{
			pageBuilder.append("<span>").append("<a href='").append(url).append("?").append("page=").append(page+1)
			.append(paramBuilder).append("'>").append("下一页").append("</a>").append("</span>");
		}
		pageBuilder.append("</div>");
		return pageBuilder.toString();
	}
}

安全工具类SafeUtil

package com.itbaizhan.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.springframework.util.Base64Utils;
/**
 * 安全工具类
 */
public class SafeUtil {
	
	/**
	 * md5加密字符串
	 * @param str
	 * @return
	 */
	public final static String md5(String str){
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		messageDigest.update(str.getBytes());
		return Base64Utils.encodeToString(messageDigest.digest());
	}
	
	/**
	 * sha1加密字符串
	 * @param str
	 * @return
	 */
	public final static String sha1(String str){
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance("SHA-1");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		messageDigest.update(str.getBytes());
		return Base64Utils.encodeToString(messageDigest.digest());
	}

	/**
	 * 使用特定加密范式加密
	 * @param str
	 * @return
	 */
	public final static String encode(String str){
		return md5(sha1(md5(str)));
	}
	
	public static void main(String[] args) {
		System.out.println(encode("1"));
	}
	
}

上传工具类UploadUtil

package com.itbaizhan.util;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

/**
 * 上传工具类
 */
public class UploadUtil {
	

	/**
	 * 图片上传
	 * @return 返回相对路径
	 * @param photo 图片文件
	 * @param photoFileName 文件名
	 * @param savePath 文件保存路径(相对于web根目录)
	 * @return
	 */
	public static String fileUpload(File photo, String photoFileName, String savePath){
		if (photo == null) {
			return null;
		} // 如果上传图片不为空则进行上传图片操作
		// 文件存储路径
		String path = ServletActionContext.getServletContext().getRealPath("/")+savePath;			
		// 获取当前文件类型
		String type = photoFileName.substring(photoFileName.lastIndexOf(".")+1, photoFileName.length());
        // 获取当前系统时间字符串
		String time = new SimpleDateFormat("yyMMddssSSS").format(new Date());
		// 构建新文件名
		String newFileName = time+"."+type;
		// 按指定路径重命名构建文件
		File savefile = new File(path,newFileName);
		// 若保存文件的文件夹不存在则创建
		if(!savefile.getParentFile().exists()){
			savefile.getParentFile().mkdirs();
		}
		System.err.println("上传文件绝对路径: "+savefile.getPath());
		try {// 将上传文件的内容复制到新建文件中
			FileUtils.copyFile(photo, savefile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return savePath+"/"+newFileName;
	}

}

可以将上面三个工具类放在一个package中,我的就是。

下面在看几个文件配置,首先是spring.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:tx="http://www.springframework.org/schema/tx"
     xmlns:aop="http://www.springframework.org/schema/aop"
     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.xsd
        http://www.springframework.org/schema/tx
       	http://www.springframework.org/schema/tx/spring-tx.xsd
       	http://www.springframework.org/schema/aop 
       	http://www.springframework.org/schema/aop/spring-aop.xsd">
	
	<!-- spring注解搜寻范围 -->
	<context:component-scan base-package="com"/>
	<!-- 引用数据库配置文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	<!-- 配置数据源 -使用c3p0连接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<property name="driverClass" value="${jdbc.driver}" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<!-- c3p0连接池参数配置 -->
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}" /><!-- 初始化连接数 -->
        <property name="minPoolSize" value="${c3p0.minPoolSize}" /><!-- 最小连接数 -->
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}" /><!-- 连接池中保留的最大连接数 -->
		<property name="maxIdleTime" value="${c3p0.maxIdleTime}" /><!-- 连接的过期时间(秒) -->
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" /><!-- 检查连接池中的空闲连接间隔时间(秒) -->
	</bean>
	<!-- 配置hibernate - sessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- 实体类所在的包 对包中每个类进行注解扫描 省去逐一配置-->
		<property name="packagesToScan">
			<list><value>com.itbaizhan.entity</value></list>
		</property>
		<!-- 配置Hibernate属性-->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop><!-- 数据库方言 -->
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop><!-- 是否打印sql语句 -->
				<prop key="hibernate.connection.useUnicode">${hibernate.connection.useUnicode}</prop><!-- 连接数据库时是否使用Unicode编码 -->
				<prop key="hibernate.connection.characterEncoding">${hibernate.connection.characterEncoding}</prop><!-- 连接数据库时数据的传输字符集编码方式 -->
			</props>
		</property>
	</bean>
	<!-- 配置hibernate事务管理器 -->
  	<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    	<property name="sessionFactory" ref="sessionFactory"/>
  	</bean>
	<!-- 使用注解-注册事务管理类或方法 -->
	<tx:annotation-driven transaction-manager="transactionManager"/>
</beans> 

struts.xml文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>

	<!-- 请求参数的编码方式 -->
	<constant name="struts.i18n.encoding" value="UTF-8" />

	<!-- 指定被struts2处理的请求后缀类型。多个用逗号隔开 -->
	<constant name="struts.action.extension" value="action" />

	<!-- 当struts.xml改动后,是否重新加载。默认值为false,开发阶段最好打开 -->
	<constant name="struts.configuration.xml.reload" value="true" />

	<!-- 是否使用struts的开发模式。开发模式会有更多的调试信息  -->
	<constant name="struts.devMode" value="false" />

	<!-- 设置浏览器是否缓存静态内容。默认值为true,开发阶段最好关闭 -->
	<constant name="struts.serve.static.browserCache" value="false" />

	<!-- 是否开启动态方法调用 - 允许使用! 匹配请求 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />

	<!-- 指定由spring负责action对象的创建  -->
	<constant name="struts.objectFactory" value="spring" />


</struts>

接下来就是实体类entity、action、service、dao层代码编写,代码太多,在这里就分享下每个层的基类,entity实体类除外

entity文件夹下的admin类:

package com.itbaizhan.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity // 注解为hibernate实体 对应数据库中同名表
public class Admin {
	
	@Id	// 注解主键
	@GeneratedValue //id生成策略  默认auto 相当于hibernate的native - 自增字段
	private int id;
	private String username;
	private String password;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	
	
}

action文件下的adminAction:

package com.itbaizhan.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.itbaizhan.entity.Admin;

@Repository // 注册dao层bean等同于@Component
@SuppressWarnings("unchecked")
public class AdminDao extends BaseDao{

	/**
	 * 通过用户名查找
	 * @param username
	 * @return
	 */
	public Object getByUsername(String username) {
		return (Admin)getSession().createQuery("from Admin where username=:username")
				.setString("username", username).uniqueResult();
	}
	
	/**
	 * 通过用户名和密码查找
	 * @param username
	 * @param password
	 * @return 无记录返回null
	 */
	public Admin getByUsernameAndPassword(String username, String password){
		return (Admin)getSession().createQuery("from Admin where username=:username and password=:password")
				.setString("username", username).setString("password", password).uniqueResult();
	}

	/**
	 * 获取列表
	 * @param page
	 * @param rows
	 * @return 无记录返回空集合
	 */
	public List<Admin> getList(int page, int rows){
		return getSession().createQuery("from Admin").setFirstResult(rows*(page-1)).setMaxResults(rows).list();
	}

	/**
	 * 总数
	 * @return
	 */
	public long getTotal() {
		return (Long) getSession().createQuery("select count(*) from Admin").uniqueResult();
	}

	
}

service文件下的adminService:

package com.itbaizhan.service;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itbaizhan.dao.AdminDao;
import com.itbaizhan.entity.Admin;
import com.itbaizhan.util.SafeUtil;

@Service	// 注解为service层spring管理bean
@Transactional	// 注解此类所有方法加入spring事务, 具体设置默认
public class AdminService {

	@Resource		//spring注入类对象
	private AdminDao adminDao;
	
	/**
	 * 验证用户密码
	 * @param username
	 * @param password
	 * @return
	 */
	public boolean checkUser(String username, String password){
		return adminDao.getByUsernameAndPassword(username, SafeUtil.encode(password)) != null;
	}
	
	/**
	 * 是否存在
	 * @param username
	 * @return
	 */
	public boolean isExist(String username) {
		return adminDao.getByUsername(username) != null;
	}

	/**
	 * 列表
	 * @param page
	 * @param rows
	 * @return
	 */
	public List<Admin> getList(int page, int rows) {
		return adminDao.getList(page, rows);
	}

	/**
	 * 总数
	 * @return
	 */
	public long getTotal() {
		return adminDao.getTotal();
	}

	/**
	 * 通过id查询
	 * @param id
	 * @return
	 */
	public Admin get(int id) {
		return adminDao.get(Admin.class, id);
	}
	
	/**
	 * 添加
	 * @param admin
	 */
	public Integer add(Admin admin) {
		admin.setPassword(SafeUtil.encode(admin.getPassword()));
		return adminDao.save(admin);
	}
	
	/**
	 * 更新
	 * @param user
	 */
	public boolean update(Admin admin) {
		return adminDao.update(admin);
	}

	/**
	 * 删除
	 * @param user
	 */
	public boolean delete(Admin admin) {
		return adminDao.delete(admin);
	}


	
}

dao文件下的adminDao:

package com.itbaizhan.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.itbaizhan.entity.Admin;

@Repository // 注册dao层bean等同于@Component
@SuppressWarnings("unchecked")
public class AdminDao extends BaseDao{

	/**
	 * 通过用户名查找
	 * @param username
	 * @return
	 */
	public Object getByUsername(String username) {
		return (Admin)getSession().createQuery("from Admin where username=:username")
				.setString("username", username).uniqueResult();
	}
	
	/**
	 * 通过用户名和密码查找
	 * @param username
	 * @param password
	 * @return 无记录返回null
	 */
	public Admin getByUsernameAndPassword(String username, String password){
		return (Admin)getSession().createQuery("from Admin where username=:username and password=:password")
				.setString("username", username).setString("password", password).uniqueResult();
	}

	/**
	 * 获取列表
	 * @param page
	 * @param rows
	 * @return 无记录返回空集合
	 */
	public List<Admin> getList(int page, int rows){
		return getSession().createQuery("from Admin").setFirstResult(rows*(page-1)).setMaxResults(rows).list();
	}

	/**
	 * 总数
	 * @return
	 */
	public long getTotal() {
		return (Long) getSession().createQuery("select count(*) from Admin").uniqueResult();
	}

	
}

每个层的代码因为太多了,就给大家分享了每个层的一个类的方面的代码。

下面给大家要是如何使项目运行起来:当我们导入项目后,基础设置修改好,就来这里配置下项目所需的配置。

进入后通常problem这里会提示错误

出现错误先不着急修改,先看上面的配置是否正确。先看modules这一块

往下走Libraries

如果以上都没有错的话,就可以配置tomcat了

到这所有的配置都已完成,就可以启动tomcat看看效果了

访问成功,说明自己的配置没有错误,不知道你们学会了没。

如果想要这个源码的话,也可以私聊我。

为了巩固知识,做的一个网站。基于struts2+spring+springjdbc开发的代码分享网,所有源码已开源。 网站功能介绍: 1、邮件注册(采用阿里云企业邮箱),为了让大家体验一下邮箱注册功能。我已经在分享源码中,为大家配置好了测试账户,大家可以在自己电脑上进行测试。 2、md5加密,注册用户,所有密码会以密文保存在数据库,可以保证安全。 3、代码分享功能(核心功能),该功能的主要特色是集成了优秀的文本编辑器,支持插入代码、插入链接、插入表情、插入图片、支持在线预览。同时也实现了文件上传(基于struts2的文件上传功能)。 4、代码下载,下载功能会判断用户是否下载过该代码,若下载过则不扣积分。下载功能也是基于struts2的下载模块实现的。 5、代码评论,该功能是我仿照qq空间评论功能实现的,在本站中,我是以时间倒叙方式显示的(也支持正序)。 6、代码收藏,用户可以收藏代码。 7、消息中心,分为了0系统消息、1评论消息、2兑换消息、3上传图片消息、4上传文件消息、5下载消息(用户扣除积分)、6下载消息。 8、代码中心,分为了分享代码、下载代码、评论代码、收藏代码。 9、设置功能,支持修改昵称、城市、性别、座右铭、密码、头像。 10、赞助兑换功能,支持1个赞助兑换10个积分,也支持用赞助升级称号。 11、其他功能包括:图片压缩处理功能(即使是几M的图片,压缩后也只有几十kb)。通用json处理功能(向方法中传递任何参数,int、string等,都会返回json数据,而且速度很快)。分词功能(点击某一个分享,进入详情页的时候,会对该分享名称进行分词,并且加入到head中,利于网站seo)。 可能还有一些其他功能,通过查看源码可了解。 网站技术介绍: 1、采用语言,java 2、后台框架,struts2+spring+spring JDBC 3、前台技术,layui+jquery+ajax 网站设计思路: 前台渲染是采用的jsp技术,为了保证网站的速度,我使用了几种方法: 1、我将重复的代码保存成单独的jsp文件然后引入(这样的好处就是重复的jsp文件只会加载一次,然后浏览器缓存,下次加载速度会提升)。比如,我将link和header单独提取出来,然后在其他页面进行引入: 2、所有的业务功能,我都放在了html加载完成之后,利用jquery+ajax获取数据后再渲染界面(这样的好处就是给用户的感觉是网站速度很快。因为用户打开后,立马渲染html代码,此时网站结构已经出现,接着用jqury+ajx去后台获取数据。由于我的sql语句严格控制在ms级别,所以只需要几百ms,数据即可拿到,此时渲染在页面上给用户的感觉很快) 3、sql语句的控制,本站的所有sql语句,均控制在1s以下。这块我花了很长时间进行sql优化,我举个例子:为了减少数据库的访问次数,我会想方设法通过一条语句获取所有信息,并且严格控制它的执行速度,绝对不可以超过1s。首页的下载榜、评论榜、收藏榜,这三个功能的数据就是通过一条sql语句获取的: #优化联合查询用户评论、下载、收藏的资源列表 select a.sort,a.id,r.name,a.nowtime,r.isjing,r.isyuan, ifnull(c.res_comments_num,0) as res_comments_num, ifnull(d.res_download_num,0) as res_download_num, ifnull(kp.res_keep_num,0) as res_keep_num from #sort为1代表用户评论的代码列表 (select 1 as sort,c.resources_id as id,c.nowtime as nowtime from comments c #需要指定用户 where c.user1_id = 1 group by c.resources_id union all #sort为2代表用户下载的代码列表 select 2 as sort,d.resources_id as id,d.nowtime as nowtime from download d #需要指定用户 where d.user_id = 1 group by d.resources_id union all #sort为3代表用户收藏的代码列表 select 3 as sort,k.resources_id as id,k.nowtime as nowtime from keep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值